Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты

Маршрут связывает адрес страницы с кодом, который её формирует. В 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 cr

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

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 сообщит о неверном файле или маршрут просто не появится — сверяйте отступы с примером.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.