Как подключать внешние источники маршрутизации

Простые прилоения могут определять все свои маршруты в одном файле конфигурации - обычно config/routes.yaml (см. Creating Routes). Однако, в большинстве приложений распространено импортирование определений маршрутов из разных источников: PHP аннотаций в файлах контроллера, файлов YAML или XML, хранящихся в каком-то каталоге и т.д.

Это можно сделать, импортировав источники маршрутизации из главного файла маршрутизации:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # config/routes.yaml
    app_file:
        # загружает маршруты из заданного файла маршрутизации, хранящегося в каком-то пакете
        resource: '@AcmeOtherBundle/Resources/config/routing.yml'
    
    app_annotations:
        # загружает маршруты из PHP аннотаций контроллеров, найденных в этом каталоге
        resource: '../src/Controller/'
        type:     annotation
    
    app_directory:
        # загружает маршруты из файлов YAML или XML, найденных в этом каталоге
        resource: '../legacy/routing/'
        type:     directory
    
    app_bundle:
        # загружает маршруты из файлов YAML или XML, найденных в каком-то каталоге пакета
        resource: '@AppBundle/Resources/config/routing/public/'
        type:     directory
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!-- config/routes.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">
    
        <!-- загружает маршруты из заданного файла маршрутизации, хранящегося в каком-то пакете -->
        <import resource="@AcmeOtherBundle/Resources/config/routing.yml" />
    
        <!-- загружает маршруты из PHP аннотаций контроллеров, найденных в этом каталоге -->
        <import resource="../src/Controller/" type="annotation" />
    
        <!-- загружает маршруты из файлов YAML или XML, найденных в этом каталоге -->
        <import resource="../legacy/routing/" type="directory" />
    
        <!-- загружает маршруты из файлов YAML или XML, найденных в каком-то каталоге пакета -->
        <import resource="@AppBundle/Resources/config/routing/public/" type="directory" />
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // config/routes.php
    use Symfony\Component\Routing\RouteCollection;
    
    $collection = new RouteCollection();
    $collection->addCollection(
        // загружает маршруты из заданного файла маршрутизации, хранящегося в каком-то пакете
        $loader->import("@AcmeOtherBundle/Resources/config/routing.yml")
    
        // загружает маршруты из PHP аннотаций контроллеров, найденных в этом каталоге
        $loader->import("../src/Controller/", "annotation")
    
        // загружает маршруты из файлов YAML или XML, найденных в этом каталоге
        $loader->import("../legacy/routing/", "directory")
    
        // загружает маршруты из файлов YAML или XML, найденных в каком-то каталоге пакета
        $loader->import("@AppBundle/Resources/config/routing/public/", "directory")
    );
    
    return $collection;
    

Note

При импортировании ресурсов из YAML, ключ (например, app_fil) бесполезен. Просто убедитесь в том, что он уникален, чтобы другие строки его не переопределяли.

Добавление префиксов к URL импортированных маршрутов

Вы также можете выбрать предоставить "префикс" для импортированных маршрутов. Например, представьте, что вы хотите добавить ко всем маршрутам приложения префикс /site (например, /site/blog/{slug} вместо /blog/{slug}):

  • Annotations
    1
    2
    3
    4
    5
    6
    7
    8
    9
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    
    /**
     * @Route("/site")
     */
    class DefaultController
    {
        // ...
    }
    
  • YAML
    1
    2
    3
    4
    5
    # config/routes.yaml
    controllers:
        resource: '../src/Controller/'
        type:     annotation
        prefix:   /site
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- config/routes.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">
    
        <import
            resource="../src/Controller/"
            type="annotation"
            prefix="/site" />
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // config/routes.php
    use Symfony\Component\Routing\RouteCollection;
    
    $app = $loader->import('../src/Controller/', 'annotation');
    $app->addPrefix('/site');
    
    $collection = new RouteCollection();
    $collection->addCollection($app);
    
    return $collection;
    

Пусть каждого загружаемого маршрута из нового источника маршрутизации теперь будет иметь префикс в виде строки /site.

Добавление префиксов к именам импортированных маршрутов

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

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
     * @Route(name="blog_")
     */
    class BlogController extends Controller
    {
        /**
         * @Route("/blog", name="index")
         */
        public function indexAction()
        {
            // ...
        }
    
        /**
         * @Route("/blog/posts/{slug}", name="post")
         */
        public function showAction(Post $post)
        {
            // ...
        }
    }
    
  • YAML
    1
    2
    3
    4
    5
    # config/routes.yaml
    controllers:
        resource:    '../src/Controller/'
        type:        annotation
        name_prefix: 'blog_'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- config/routes.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">
    
        <import
            resource="../src/Controller/"
            type="annotation"
            name-prefix="blog_" />
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // config/routes.php
    use Symfony\Component\Routing\RouteCollection;
    
    $app = $loader->import('../src/Controller/', 'annotation');
    $app->addNamePrefix('blog_');
    
    $collection = new RouteCollection();
    $collection->addCollection($app);
    
    return $collection;
    

В этом примере, имена маршрутов будут blog_index и blog_post.

New in version 4.1: Опция добавления префикса к именам маршрутов в файлах YAML, XML и PHP была представлена в Symfony 4.1. Ранее эту функцию поддерживала только аннотация @Route().

Добавление требования хоста к импортированным маршрутам

Вы можете установить регулярное вырежние хоста на импортированных маршрутах. Чтобы узнать больше, смотрите Using Host Matching of Imported Routes.

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