Nuevo en Symfony 4.1: Configuración concisa de rutas

El componente Routing de Symfony permite definir requerimientos y valores por defecto para las variables de las rutas mediante las opciones requirements y defaults respectivamente.

En el siguiente ejemplo, la ruta definida mediante una anotación PHP indica que la variable page solo admite números enteros y su valor por defecto es 1:

use Symfony\Component\Routing\Annotation\Route;
 
class BlogController extends Controller
{
    /**
     * @Route("/blog/{page}", name="blog_list", requirements={"page"="\d+"}, defaults={"page"="1"})
     */
    public function list($page)
    {
        // ...
    }
}

Cuando la configuración es simple, este formato no es muy conciso. Por eso en Symfony 4.1 hemos introducido una nueva funcionalidad para hacer más concisa la configuración de las rutas. El anterior ejemplo en Symfony 4.1 sería así:

/**
 * @Route("/blog/{page<\d+>?1}", name="blog_list")
 */
public function list($page)
{
    // ...
}

La nueva sintaxis es {nombre-de-variable<requerimientos>?valor-por-defecto} y funciona en cualquier formato de configuración que utilices (anotaciones, YAML o XML):

blog_list:
    # sin requerimientos y sin valor por defecto
    path: /blog/{page}
    # con requerimientos pero sin valor por defecto
    path: /blog/{page<\d+>}
    # sin requerimientos pero con un valor por defecto
    path: /blog/{page?1}
    # sin requerimientos pero con un valor por defecto = null
    path: /blog/{page?}
    # con requerimientos y con un valor por defecto = null
    path: /blog/{page<.*>?}

Aunque puedes usar esta configuración para más de una variable dentro de la ruta, no es aconsejable hacerlo si la configuración resultante es demasiado compleja:

// el nuevo formato de configuración es menos legible en este caso:
 
/** @Route("/{_locale<en|es|fr>?en}/blog/{category<news|releases|security>?news}/{page<\d+>?1}", name="blog_list") */
public function list($page) { }
 
// en este caso, mejor seguir usando el formato tradicional (que también puedes
// combinar con el nuevo formato solo para algunas variables determinadas)
 
/**
 * @Route("/{_locale}/blog/{category}/{page}", name="blog_list",
 *   "requirements"={"_locale": "en|es|fr", "category": "news|releases|security", "page": "\d"},
 *   "defaults"={"_locale": "en", "category": "news", "page": "1"}
 * )
 */
public function list($page) { }

Esta funcionalidad fue contribuida por Nicolas Grekas en el pull request #26518.

Fuente: New in Symfony 4.1: Inlined routing configuration

Comentarios

Publicada el

23 de abril de 2018

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.