How to Restrict Route Matching through Conditions
Edit this pageWarning: You are browsing the documentation for Symfony 3.0, which is no longer maintained.
Read the updated version of this page for Symfony 6.3 (the current stable version).
How to Restrict Route Matching through Conditions
As you've seen, a route can be made to match only certain routing wildcards
(via regular expressions), HTTP methods, or host names. But the routing system
can be extended to have an almost infinite flexibility using conditions
:
1 2 3 4
contact:
path: /contact
defaults: { _controller: AcmeDemoBundle:Main:contact }
condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"
1 2 3 4 5 6 7 8 9 10 11
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="contact" path="/contact">
<default key="_controller">AcmeDemoBundle:Main:contact</default>
<condition>context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'</condition>
</route>
</routes>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('contact', new Route(
'/contact', array(
'_controller' => 'AcmeDemoBundle:Main:contact',
),
array(),
array(),
'',
array(),
array(),
'context.getMethod() in ["GET", "HEAD"] and request.headers.get("User-Agent") matches "/firefox/i"'
));
return $collection;
The condition
is an expression, and you can learn more about its syntax
here: The Expression Syntax. With this, the route
won't match unless the HTTP method is either GET or HEAD and if the User-Agent
header matches firefox
.
You can do any complex logic you need in the expression by leveraging two variables that are passed into the expression:
context
- An instance of RequestContext, which holds the most fundamental information about the route being matched.
request
- The Symfony Request object (see The HttpFoundation Component).
Caution
Conditions are not taken into account when generating a URL.
Expressions are Compiled to PHP
Behind the scenes, expressions are compiled down to raw PHP. Our example would generate the following PHP in the cache directory:
1 2 3 4 5 6
if (rtrim($pathinfo, '/contact') === '' && (
in_array($context->getMethod(), array(0 => "GET", 1 => "HEAD"))
&& preg_match("/firefox/i", $request->headers->get("User-Agent"))
)) {
// ...
}
Because of this, using the condition
key causes no extra overhead
beyond the time it takes for the underlying PHP to execute.