Ver índice de contenidos del libro

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->get('router')->generate('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 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

Nota El host que se utiliza en as URL absolutas es el mismo host de la petición actual. Su valor se detecta automáticamente en función de la información proporcionada por PHP. Si estás ejecutando URL absolutas en un script de consola, tienes que indicar a mano el host de esas URL. Utiliza para ello el objeto RequestContext:

$router->getContext()->setHost('www.example.com');

6.8.2. 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.3. 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 este caso se utiliza una función especial llamada helper:

<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>

Y también puedes generar URL absolutas:

<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>