Suponemos que tenemos una route que muestra una lista con todos los posts de una aplicación blog:
// src/AppBundle/Controller/BlogController.php
// ...
class BlogController extends Controller
{
// ...
/**
* @Route("/blog")
*/
public function indexAction()
{
// ...
}
}
Esta route es lo más sencillo posible, no tiene placeholders y sólo coincide con la URL exacta /blog. Pero si ahora por ejemplo queremos que pueda soportar paginación, tendremos que añadir un placeholder {page} para que puedan coincidir routes como /blog/2:
// src/AppBundle/Controller/BlogController.php
// ...
/**
* @Route("/blog/{page}")
*/
public function indexAction($page)
{
// ...
}
El valor de {page} estará disponible en el controller. Su valor puede emplearse para determinar el conjunto de entradas de blog a mostrar en la página dada. Pero los placeholders son requeridos por defecto, esta route no coincidirá ya con /blog. Para ver la página 1 tendríamos que utilizar la URL /blog/1.
Para solucionar este podemos hacer el parámetro {page} opcional, lo que se consigue con defaults:
// src/AppBundle/Controller/BlogController.php
// ...
/**
* @Route("/blog/{page}", defaults={"page" = 1})
*/
public function indexAction($page)
{
// ...
}
Añadiendo page a la key defaults el placeholder {page} ya no es requerido. La URL /blog coincidirá con esta route y el valor del parámetro page será 1. La URL /blog/2 también coincidirá, mostrando la segunda página de resultados.
Se pueden tener más de un placeholder opcional (/blog/{slug}/{page}), pero todo lo de después de un placeholder opcional ha de ser opcional. Por ejemplo /{page}/blog es una dirección válida, pero page siempre será requerido (/blog no coincidirá con esta route).
Las routes con parámetros opcionales al final no coincidirán en requests con trailing slash (/): /blog/ no coincidirá, en cambio /blog sí.