La anotación @Route asigna un patrón de ruta a un controlador:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class PostController extends Controller
{
/**
* @Route("/")
*/
public function indexAction()
{
// ...
}
}
La acción index del controlador Post ya está asignada a la dirección /. Esto es equivalente a la siguiente configuración YAML:
blog_home:
pattern: /
defaults: { _controller: SensioBlogBundle:Post:index }
Al igual que cualquier patrón de ruta, puedes definir marcadores de posición, requisitos y valores predeterminados:
/**
* @Route("/{id}", requirements={"id" = "\d+"}, defaults={"id" = 1})
*/
public function showAction($id)
{
}
También puedes definir el valor predefinido para un marcador de posición con el valor predeterminado de PHP:
/**
* @Route("/{id}", requirements={"id" = "\d+"})
*/
public function showAction($id = 1)
{
}
También puedes combinar más de una URL definiendo una anotación @Route adicional:
/**
* @Route("/", defaults={"id" = 1})
* @Route("/{id}")
*/
public function showAction($id)
{
}
Las rutas se deben importar para estar activas como cualquier otro recurso de enrutado (observa el tipo annotation):
# app/config/routing.yml
# importa las rutas desde una clase controlador
post:
resource: "@SensioBlogBundle/Controller/PostController.php"
type: annotation
También puedes importar un directorio completo:
# importa rutas desde el directorio de controladores
blog:
resource: "@SensioBlogBundle/Controller"
type: annotation
Como para cualquier otro recurso, puedes «montar» las rutas bajo un determinado prefijo:
post:
resource: "@SensioBlogBundle/Controller/PostController.php"
prefix: /blog
type: annotation
A una ruta definida con la anotación @Route se le asigna un nombre predeterminado, el cual está compuesto por el nombre del paquete, el nombre del controlador y el nombre de la acción. En el caso del ejemplo anterior sería sensio_blog_post_index;
Puedes utilizar el atributo name para reemplazar este nombre de ruta predeterminado:
/**
* @Route("/", name="blog_home")
*/
public function indexAction()
{
// ...
}
Una anotación @Route en una clase controlador define un prefijo para todas las rutas de acción:
/**
* @Route("/blog")
*/
class PostController extends Controller
{
/**
* @Route("/{id}")
*/
public function showAction($id)
{
}
}
La acción show ahora se asigna al patrón /blog/{id}.
Hay un atajo en la anotación @Method para especificar el método HTTP permitido para la ruta. Para usarlo, importa el espacio de nombres de la anotación Method:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
/**
* @Route("/blog")
*/
class PostController extends Controller
{
/**
* @Route("/edit/{id}")
* @Method({"GET", "POST"})
*/
public function editAction($id)
{
}
}
La acción editar ahora es asignada al patrón /blog/editar/{id} si el método HTTP utilizado es GET o POST.
La anotación @Method sólo se toma en cuenta cuando una acción se anota con @Route.
También puedes utilizar la anotación @Route en una clase de controlador para asignar la clase controlador a un servicio para que el resolutor de controlador cree una instancia del controlador obteniendo el ID del contenedor en lugar de llamar a new PostController() en sí mismo:
/**
* @Route(service="my_post_controller_service")
*/
class PostController extends Controller
{
// ...
}