Как подключать внешние источники маршрутизации¶
Простые прилоения могут определять все свои маршруты в одном файле конфигурации
- обычно 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()
.
Добавление требования хоста к импортированным маршрутам¶
Вы можете установить регулярное вырежние хоста на импортированных маршрутах. Чтобы узнать больше, смотрите component-routing-host-imported.
Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.