Symfony 2.4, el libro oficial

6.8. Generando URL

El sistema de enrutamiento no solo se utiliza para asociar rutas a controladores sino que también se emplea para generar URL. De hecho, el enrutamiento siempre es un sistema bidireccional: convierte una URL + variables en un controlador y después, convierte una ruta y varias variables en una URL. Este sistema bidireccional se basa en los métodos match() y generate(). El siguiente código emplea la ruta blog_show definida anteriormente:

$params = $router->match('/blog/my-blog-post');
// array(
//     'slug'        => 'my-blog-post',
//     '_controller' => 'AcmeBlogBundle:Blog:show'
// )

$uri = $router->generate('blog_show', array('slug' => 'my-blog-post'));
// /blog/my-blog-post

Para generar una URL, especifica el nombre de la ruta (por ejemplo, blog_show) y el valor de todas las variables de la ruta (por ejemplo, slug = my-blog-post). Con esta información, puedes generar fácilmente cualquier URL:

class MainController extends Controller
{
    public function showAction($slug)
    {
        // ...

        $url = $this->generateUrl(
            'blog_show',
            array('slug' => 'my-blog-post')
        );
    }
}

Más adelante se explicará también cómo generar URL desde las propias plantillas de la aplicación.

Truco Si tu aplicación realiza peticiones AJAX, seguramente necesitarás generar URL de Symfony desde el propio código JavaScript. Para ello debes utilizar un bundle desarrollado por terceros y llamado FOSJsRoutingBundle:

var url = Routing.generate('blog_show', { "slug": 'my-blog-post'});

6.8.1. Generando URL con parámetros

El array que se pasa al método generate contiene los valores de las variables de la ruta, pero también puede contener variables adicionales que se añaden a la URL generada en forma de query string:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony'));
// /blog/2?category=Symfony

6.8.2. Generando URL desde una plantilla

La mayoría de URL se generan en las propias plantillas para poder enlazar entre sí las páginas de la aplicación. El formato es muy parecido al explicado anteriormente, pero en el caso de las plantillas Twig, se utiliza una función especial llamada path():

<a href="{{ path('blog_show', { 'slug': 'my-blog-post' }) }}">
  Read this blog post.
</a>
<a href="<?php echo $view['router']->generate('blog_show', array(
    'slug' => 'my-blog-post',
)) ?>">
    Read this blog post.
</a>

6.8.3. Generando URL absolutas

El sistema de enrutamiento genera por defecto URL relativas (por ejemplo /blog). Para generar URL absolutas, pasa el valor true como tercer argumento del método generate():

$router->generate('blog_show', array('slug' => 'my-blog-post'), true);
// http://www.example.com/blog/my-blog-post

En una plantilla, las URL absolutas se generan de la siguiente manera:

<a href="{{ url('blog_show', { 'slug': 'my-blog-post' }) }}">
  Read this blog post.
</a>
<a href="<?php echo $view['router']->generate('blog_show', array(
    'slug' => 'my-blog-post',
), true) ?>">
    Read this blog post.
</a>

Nota El host que se utiliza en las URL absolutas es el mismo host de la petición actual y su valor se detecta automáticamente en función de la información proporcionada por PHP.

Si estás generando URL absolutas en un script de consola, este mecanismo no funciona. Consulta este artículo para saber cómo generar las URL absolutas en un comando de consola.