Ver índice de contenidos del libro

6.1. El enrutamiento en la práctica

Una ruta es una asociación entre un patrón de URL y un controlador. Supongamos por ejemplo que deseas asociar URL de tipo /blog/mi-post o /blog/todo-sobre-symfony con un controlador que sea capaz de buscar y mostrar el artículo solicitado.

La ruta necesaria para ello es muy simple:

# app/config/routing.yml
blog_show:
    path:      /blog/{slug}
    defaults:  { _controller: AcmeBlogBundle:Blog:show }
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing
        http://symfony.com/schema/routing/routing-1.0.xsd">
 
    <route id="blog_show" path="/blog/{slug}">
        <default key="_controller">AcmeBlogBundle:Blog:show</default>
    </route>
</routes>
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
 
$collection = new RouteCollection();
$collection->add('blog_show', new Route('/blog/{slug}', array(
    '_controller' => 'AcmeBlogBundle:Blog:show',
)));
 
return $collection;

Nota La opción path solamente está definida desde la versión 2.2 de Symfony. En las versiones anteriores esta opción se llamaba pattern.

El path definido por la ruta blog_show se interpreta realmente como /blog/*, es decir, la cadena de texto /blog/ seguida de cualquier otro contenido. El valor de ese contenido se guarda en una variable llamada slug. Para la URL /blog/mi-post, la variable slug vale mi-post. Esta variable está disponible directamente en el controlador, tal y como se explicará más adelante.

El parámetro _controller es una opción especial que le dice a Symfony qué controlador se debe ejecutar cuando la URL solicitada por el usuario coincide con el patrón de la ruta. El controlador se indica a través de su nombre lógico, que es una notación especial para hacer referencia a un método concreto de una clase concreta de PHP:

// src/Acme/BlogBundle/Controller/BlogController.php
 
namespace Acme\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 
class BlogController extends Controller
{
    public function showAction($slug)
    {
        $blog = // usa la variable $slug para consultar la base de datos
 
        return $this->render('AcmeBlogBundle:Blog:show.html.twig', array(
            'blog' => $blog,
        ));
    }
}

¡Enhorabuena! Acabas de crear tu primera ruta y la has asociado a un controlador. Ahora, cuando visites /blog/mi-post, se ejecutará el controlador showAction y se le pasará una variable llamada $slug cuyo valor será mi-post.

Este es el objetivo del enrutador de Symfony2: asociar la URL de una petición a un controlador. En el resto del capítulo vas a aprender todo tipo de trucos que te facilitarán el trabajo incluso con las URL más complejas.