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

Все маршруты загружаются единым файлом конфигурации - обычно app/config/routing.yml (см. Creating Routes). Однако, если вы используете аннотации маршрутизации, вам понадобится направить маршрутизатор к контроллерам с помощью аннотаций. Это можно сделать путём "импорта" каталогов в конфигурацию маршрутизации:

  • YAML
    1
    2
    3
    4
    # app/config/routing.yml
    app:
        resource: '@AppBundle/Controller/'
        type:     annotation # required to enable the Annotation reader for this resource
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <!-- 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">
    
        <!-- the type is required to enable the annotation reader for this resource -->
        <import resource="@AppBundle/Controller/" type="annotation"/>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    
    $collection = new RouteCollection();
    $collection->addCollection(
        // второй авргумент - это тип, который должен активировать
        // считыватель аннотаций для этого ресурса
        $loader->import("@AppBundle/Controller/", "annotation")
    );
    
    return $collection;
    

Note

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

Ключ resource загружает данный ресурс маршрутизации. В этом примере, ресурс - это каталог, где синтаксис сокращения @AppBundle разрешает полный путь пакета AppBundle. При направлении его в каталог, все файлы в этом каталоге разбираются и помещаются в маршрутизацию.

Note

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

  • YAML
    1
    2
    3
    # app/config/routing.yml
    app:
        resource: '@AcmeOtherBundle/Resources/config/routing.yml'
    
  • XML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 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">
    
        <import resource="@AcmeOtherBundle/Resources/config/routing.xml" />
    </routes>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    
    $collection = new RouteCollection();
    $collection->addCollection(
        $loader->import("@AcmeOtherBundle/Resources/config/routing.php")
    );
    
    return $collection;
    

Использование префиксов в импортированных маршрутах

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

  • YAML
    1
    2
    3
    4
    5
    # app/config/routing.yml
    app:
        resource: '@AppBundle/Controller/'
        type:     annotation
        prefix:   /site
    
  • 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">
    
        <import
            resource="@AppBundle/Controller/"
            type="annotation"
            prefix="/site" />
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    
    $app = $loader->import('@AppBundle/Controller/', 'annotation');
    $app->addPrefix('/site');
    
    $collection = new RouteCollection();
    $collection->addCollection($app);
    
    return $collection;
    

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

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

Вы можете установить регулярное вырежние хоста на импортированных маршрутах. Чтобы узнать больше, смотрите Использование соответствия хостов в импортированных маршрутах.

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