Как позволить знак "/" в параметре маршрута

Иногда вам понадобится составлять URL с параметрами, которые содержат в себе слеш /. Например, возьмём классический маршрут /hello/{username}. По умолчанию, /hello/Fabien будет соответствовать этому маршруту, но не /hello/Fabien/Kris. Это так потому что Symfony использует этот знак в качестве разделителя между частями маршрута.

Этот справочник объясняет, как вы можете изменить маршрут так, чтобы /hello/Fabien/Kris соответствовал маршруту /hello/{username}, где {username} равняется Fabien/Kris.

Конфигурация маршрута

По умолчанию, маршруизатор Symfony требует, чтобы параметры соответствовали следующему пути регулярного выражения: [^/]+. Это означает, что допускаются все знаки, кроме /.

Вам нужно ясно позволить / быть частью вашего параметра, указав более позволяющий путь регулярного выражения.

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    
    class DemoController
    {
        /**
         * @Route("/hello/{username}", name="_hello", requirements={"username"=".+"})
         */
        public function helloAction($username)
        {
            // ...
        }
    }
    
  • YAML
    1
    2
    3
    4
    5
    _hello:
        path:     /hello/{username}
        defaults: { _controller: AppBundle:Demo:hello }
        requirements:
            username: .+
    
  • 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/{username}">
            <default key="_controller">AppBundle:Demo:hello</default>
            <requirement key="username">.+</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/{username}', array(
        '_controller' => 'AppBundle:Demo:hello',
    ), array(
        'username' => '.+',
    )));
    
    return $collection;
    

Вот и всё! Теперь параметр {username} может содержать в себе знак /.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.