I always tend to forget these built-in symfony functions for making links.

+1  A: 

This advice is for symfony 1.0. It probably will work for later versions.

Within your sfAction class:

string genUrl($parameters = array(), $absolute = false)

eg. $this->getController()->genUrl('yourmodule/youraction?key=value&key2=value', true);

In a template:

This will generate a normal link.

string link_to($name, $internal_uri, $options = array());

eg. link_to('My link name', 'yourmodule/youraction?key=value&key2=value');

+4  A: 

If your goal is to have user-friendly URLs throughout your application, use the following approach:

1) Create a routing rule for your module/action in the application's routing.yml file. The following example is a routing rule for an action that shows the most recent questions in an application, defaulting to page 1 (using a pager):

   url:    questions/recent/:page
   param:  { module: questions, action: recent, page: 1 }

2) Once the routing rule is set, use the url_for() helper in your template to format outgoing URLs.

<a href="<?php echo url_for('questions/recent?page=1') ?>">Recent Questions</a>

In this example, the following URL will be constructed: http://myapp/questions/recent/1.html.

3) Incoming URLs (requests) will be analyzed by the routing system, and if a pattern match is found in the routing rule configuration, the named wildcards (ie. the :/page portion of the URL) will become request parameters.

You can also use the link_to() helper to output a URL without using the HTML <a> tag.

Just a nit, but the URL will not be constructed with the .html part unless the application is configured to do so (by default it is not).
Nathan Strong

In addition, if you actually want a query string with that url, you use this:

link_to('My link name', 'yourmodule/youraction?key=value&key2=value',array('query_string'=>'page=2'));

Otherwise, it's going to try to route it as part of the url and likely break your action.