Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Symfony hosting done right

ServerGrove, outstanding support at the right price for your Symfony hosting needs.
servergrove.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

How to allow a "/" character in a route parameter

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 path: [^/]+. This means that all characters are allowed except /.

You must explicitly allow / to be part of your parameter by specifying a more permissive regex path.

  • YAML
    1
    2
    3
    4
    5
    _hello:
        path:     /hello/{name}
        defaults: { _controller: AcmeDemoBundle:Demo:hello }
        requirements:
            name: ".+"
    
  • 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="_hello" path="/hello/{name}">
            <default key="_controller">AcmeDemoBundle:Demo:hello</default>
            <requirement key="name">.+</requirement>
        </route>
    </routes>
    
  • PHP
     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;
    
  • Annotations
     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.