@@ -5,47 +5,47 @@ How to Allow a "/" Character in a Route Parameter
55=================================================
66
77Sometimes, you need to compose URLs with parameters that can contain a slash
8- ``/ ``. For example, take the classic ``/hello/{username } `` route. By default,
9- ``/hello/Fabien `` will match this route but not `` /hello/Fabien/Kris `` . This
10- is because Symfony uses this character as separator between route parts.
8+ ``/ ``. For example, consider the ``/share/{token } `` route. If the `` token ``
9+ value contains a ``/ `` character this route won't match . This is because Symfony
10+ uses this character as separator between route parts.
1111
12- This guide covers how you can modify a route so that `` /hello/Fabien/Kris ``
13- matches the ``/hello/{username} `` route, where `` {username} `` equals `` Fabien/Kris `` .
12+ This article explains how you can modify a route definition so that placeholders
13+ can contain the ``/ `` character too .
1414
1515Configure the Route
1616-------------------
1717
18- By default, the Symfony Routing component requires that the parameters
19- match the following regex path : ``[^/]+ ``. This means that all characters
20- are allowed except ``/ ``.
18+ By default, the Symfony Routing component requires that the parameters match
19+ the following regular expression : ``[^/]+ ``. This means that all characters are
20+ allowed except ``/ ``.
2121
22- You must explicitly allow ``/ `` to be part of your parameter by specifying
23- a more permissive regex path.
22+ You must explicitly allow ``/ `` to be part of your placeholder by specifying
23+ a more permissive regular expression for it:
2424
2525.. configuration-block ::
2626
2727 .. code-block :: php-annotations
2828
2929 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
3030
31- class DemoController
31+ class DefaultController
3232 {
3333 /**
34- * @Route("/hello/{username }", name="_hello ", requirements={"username "=".+"})
34+ * @Route("/share/{token }", name="share ", requirements={"token "=".+"})
3535 */
36- public function helloAction($username )
36+ public function shareAction($token )
3737 {
3838 // ...
3939 }
4040 }
4141
4242 .. code-block :: yaml
4343
44- _hello :
45- path : /hello/{username }
46- defaults : { _controller: AppBundle:Demo:hello }
44+ share :
45+ path : /share/{token }
46+ defaults : { _controller: AppBundle:Default:share }
4747 requirements :
48- username : .+
48+ token : .+
4949
5050 .. code-block :: xml
5151
@@ -55,9 +55,9 @@ a more permissive regex path.
5555 xsi : schemaLocation =" http://symfony.com/schema/routing
5656 http://symfony.com/schema/routing/routing-1.0.xsd" >
5757
58- <route id =" _hello " path =" /hello/{username }" >
59- <default key =" _controller" >AppBundle:Demo:hello </default >
60- <requirement key =" username " >.+</requirement >
58+ <route id =" share " path =" /share/{token }" >
59+ <default key =" _controller" >AppBundle:Default:share </default >
60+ <requirement key =" token " >.+</requirement >
6161 </route >
6262 </routes >
6363
@@ -67,12 +67,20 @@ a more permissive regex path.
6767 use Symfony\Component\Routing\Route;
6868
6969 $collection = new RouteCollection();
70- $collection->add('_hello ', new Route('/hello/{username }', array(
71- '_controller' => 'AppBundle:Demo:hello ',
70+ $collection->add('share ', new Route('/share/{token }', array(
71+ '_controller' => 'AppBundle:Default:share ',
7272 ), array(
73- 'username ' => '.+',
73+ 'token ' => '.+',
7474 )));
7575
7676 return $collection;
7777
78- That's it! Now, the ``{username} `` parameter can contain the ``/ `` character.
78+ That's it! Now, the ``{token} `` parameter can contain the ``/ `` character.
79+
80+ .. note ::
81+
82+ If the route defines several placeholders and you apply this permissive
83+ regular expression to all of them, the results won't be the expected. For
84+ example, if the route definition is ``/share/{path}/{token} `` and both
85+ ``path `` and ``token `` accept ``/ ``, then ``path `` will contain its contents
86+ and the token, and ``token `` will be empty.
0 commit comments