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.