Condiciones en routes en Symfony

Con las condiciones es posible establecer restricciones muy precisas para las routes de aplicaciones Symfony

Contenido modificable

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

Una route puede configurarse para coincidir con sólo wildcards concretos (a través de expresiones regulares), métodos HTTP o nombres de host. Pero el sistema de routing también se puede extender para tener una flexibilidad muy elevada empleando condiciones:

contact:
    path:     /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }
    condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"

La condición es una expresión, escrita según el componente ExpressionLanguage. Con esto, la route no coincidirá a no ser que el método HTTP sea GET o HEAD y si el User-Agent tenga la palabra firefox.

Puedes establecer lógicas más complejas en la expresión proporcionando dos variables que se pasarán a la expresión.

context

Una instancia de RequestContext, que almacena información fundamental sobre la route: baseUrl, pathInfo, method, host, scheme, httpPort, httpsPort, queryString.

request

El objeto Request de Symfony.

Las condiciones no se tienen en cuenta cuando se genera una URL.

Las expresiones se compilan a PHP puro. El ejemplo anterior generaría lo siguiente:

if (rtrim($pathinfo, '/contact') === '' && (
    in_array($context->getMethod(), array(0 => "GET", 1 => "HEAD"))
    && preg_match("/firefox/i", $request->headers->get("User-Agent"))
)) {
    // ...
}

Por esa razón emplear la key condition no causa retraso en la ejecución aparte del poco que genere el código de PHP.