Маршруты
Маршрут связывает адрес страницы с кодом, который её формирует. В Drupal маршруты не пишут на PHP — их описывают в файле YAML внутри модуля.
Где лежат маршруты
Маршруты модуля blog описывают в файле blog.routing.yml в корне папки модуля. Создайте его вручную.
Первый маршрут
# web/modules/custom/blog/blog.routing.yml
blog.list:
path: '/blog'
defaults:
_controller: '\Drupal\blog\Controller\BlogController::list'
_title: 'Блог'
requirements:
_permission: 'access content'Запись сообщает: по адресу /blog нужно вызвать метод list класса BlogController. Самого класса ещё нет — он появится на следующем уроке, и до тех пор адрес /blog отвечает ошибкой.
Из чего состоит маршрут
| Ключ | Что означает |
|---|---|
blog.list | Имя маршрута. Принято начинать с имени модуля |
path | Адрес. Всегда начинается с косой черты |
_controller | Класс и метод через два двоеточия |
_title | Заголовок страницы и вкладки браузера |
requirements | Условия, при которых страница доступна |
_permission: 'access content' — право «Просмотр опубликованного содержимого». По умолчанию оно есть у всех, включая гостей. Условия доступа разобраны через урок.
Несколько маршрутов
Маршруты одного модуля перечисляют в одном файле друг под другом:
# web/modules/custom/blog/blog.routing.yml
blog.list:
path: '/blog'
defaults:
_controller: '\Drupal\blog\Controller\BlogController::list'
_title: 'Блог'
requirements:
_permission: 'access content'
blog.about:
path: '/blog/about'
defaults:
_controller: '\Drupal\blog\Controller\BlogController::about'
_title: 'О блоге'
requirements:
_permission: 'access content'У каждого маршрута своё имя и свой метод контроллера. Имена в пределах сайта не должны повторяться.
Применение изменений
vendor/bin/drush crDrupal читает файлы маршрутов только при очистке кеша. Проверить, что маршрут зарегистрирован, можно командой:
vendor/bin/drush route --path=/blogОна печатает имя маршрута, контроллер и условия доступа.
Ссылка на маршрут
В коде и шаблонах на страницу ссылаются по имени маршрута, а не по адресу:
// в любом классе PHP
use Drupal\Core\Url;
$url = Url::fromRoute('blog.list')->toString(); // /blogВ шаблоне Twig то же самое делает функция path('blog.list'). Если адрес в blog.routing.yml изменится, все ссылки по имени продолжат работать.
Частая ошибка
YAML чувствителен к отступам. Ключи path, defaults и requirements сдвинуты на два пробела относительно имени маршрута, а их содержимое — ещё на два. Табуляция недопустима. При ошибке в отступах drush cr сообщит о неверном файле или маршрут просто не появится — сверяйте отступы с примером.