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

Caution: You are browsing the documentation for Symfony version 2.0 which is not maintained anymore. If some of your projects are still using this version, consider upgrading to Symfony 2.5.

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
    1
    2
    3
    4
    5
    _hello:
        pattern: /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" pattern="/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.

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