Valores por defecto en URLs en Symfony

Con el routing de Symfony podemos establecer valores por efecto para fijar un comportamiento en una URL determinada

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

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