How to Restrict Route Matching through Conditions
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
:
- YAML
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'"
- XML
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>
- PHP
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
Symfony\Component\Routing\RequestContext
, which holds the most fundamental information about the route being matched. request
- The Symfony
Symfony\Component\HttpFoundation\Request
object (see Request).
Caution
Conditions are not taken into account when generating a URL.
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.