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.