How to allow a "/" character in a route parameter
Edit this pageWarning: You are browsing the documentation for Symfony 2.1, which is no longer maintained.
Read the updated version of this page for Symfony 6.2 (the current stable version).
How to allow a "/" character in a route parameter
Sometimes, you need to compose URLs with parameters that can contain a slash/
. For example, take the classic /hello/{name}
route. By default,
/hello/Fabien
will match this route but not /hello/Fabien/Kris
. This
is because Symfony uses this character as separator between route parts.
This guide covers how you can modify a route so that /hello/Fabien/Kris
matches the /hello/{name}
route, where {name}
equals Fabien/Kris
.
Configure the Route
By default, the Symfony routing components requires that the parameters
match the following regex pattern: [^/]+
. This means that all characters
are allowed except /
.
You must explicitly allow /
to be part of your parameter by specifying
a more permissive regex pattern.
- YAML
- XML
- PHP
- Annotations
1 2 3 4 5
_hello:
pattern: /hello/{name}
defaults: { _controller: AcmeDemoBundle:Demo:hello }
requirements:
name: ".+"
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="_hello" pattern="/hello/{name}">
<default key="_controller">AcmeDemoBundle:Demo:hello</default>
<requirement key="name">.+</requirement>
</route>
</routes>
1 2 3 4 5 6 7 8 9 10 11
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('_hello', new Route('/hello/{name}', array(
'_controller' => 'AcmeDemoBundle:Demo:hello',
), array(
'name' => '.+',
)));
return $collection;
1 2 3 4 5 6 7 8 9 10 11 12
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class DemoController
{
/**
* @Route("/hello/{name}", name="_hello", requirements={"name" = ".+"})
*/
public function helloAction($name)
{
// ...
}
}
That's it! Now, the {name}
parameter can contain the /
character.