Как использовать параметры сервис-контейнера в ваших маршрутах

Как использовать параметры сервис-контейнера в ваших маршрутах

Иногда вам может показаться полезной возможность сделать некоторые части ваших маршрутов глобально настраиваемыми. Например, если вы посмтроите интернационализированный сайт, вы скорее всего начнёте с одной или двух локалей. Естественно, вы добавите требование к вашим маршрутам, чтобы избежать соответствия пользователя с любой локалью кроме тех, что вы поддерживаете.

Вы могли бы жестко закодировать ваше требование _locale во всех ваших маршрутах, но лучшим решением будет использовать настраиваемый параметр сервис-контейнера прямо внутри вашей конфигурации маршрутизации:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/routing.yml
    contact:
        path:     /{_locale}/contact
        defaults: { _controller: AppBundle:Main:contact }
        requirements:
            _locale: '%app.locales%'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- app/config/routing.xml -->
    <?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="contact" path="/{_locale}/contact">
            <default key="_controller">AppBundle:Main:contact</default>
            <requirement key="_locale">%app.locales%</requirement>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('contact', new Route('/{_locale}/contact', array(
        '_controller' => 'AppBundle:Main:contact',
    ), array(
        '_locale' => '%app.locales%',
    )));
    
    return $collection;
    

Теперь вы можете контролировать и устанавливать параметр ``app.locales``где-то в вашем контейнере:

  • YAML
    1
    2
    3
    # app/config/config.yml
    parameters:
        app.locales: en|es
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/config.xml -->
    <?xml version="1.0" charset="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <parameters>
            <parameter key="app.locales">en|es</parameter>
        </parameters>
    </container>
    
  • PHP
    1
    2
    // app/config/config.php
    $container->setParameter('app.locales', 'en|es');
    

Вы также можете использовать параметр, чтобы определять путь вашего маршрута (или часть вашего пути):

  • YAML
    1
    2
    3
    4
    # app/config/routing.yml
    some_route:
        path:     /%app.route_prefix%/contact
        defaults: { _controller: AppBundle:Main:contact }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/routing.xml -->
    <?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="some_route" path="/%app.route_prefix%/contact">
            <default key="_controller">AppBundle:Main:contact</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('some_route', new Route('/%app.route_prefix%/contact', array(
        '_controller' => 'AppBundle:Main:contact',
    )));
    
    return $collection;
    

Note

Так же, как в обычных файлах конфигурации сервис-контейнера, если вам действительно нужен знак % в вашем маршруте, вы можете избежать знак процентов путём его удвоения, например, /score-50%%, что будет сводиться к /score-50%.

Однако, так как знаки %, включённые в любой URL автоматически шифруются, итоговым URL этого примера будет /score-50%25 (%25 - это результат шифрования знака %).

Для управления параметрами в классе внедрения зависимостей, смотрите Using Parameters within a Dependency Injection Class.

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