Параметры и доступ к маршруту
Параметр маршрута — изменяемая часть адреса: год в /blog/year/2026 или номер материала в /blog/5/info. Один маршрут с параметром заменяет сколько угодно похожих страниц. В том же описании маршрута задают, кому страница доступна.
Параметр в адресе
Параметр записывают в фигурных скобках. Добавьте маршрут в blog.routing.yml:
# web/modules/custom/blog/blog.routing.yml
blog.year:
path: '/blog/year/{year}'
defaults:
_controller: '\Drupal\blog\Controller\BlogController::year'
_title: 'Архив'
requirements:
_permission: 'access content'Значение попадает в аргумент метода с тем же именем:
// web/modules/custom/blog/src/Controller/BlogController.php
public function year(string $year): array
{
return [
'#markup' => $this->t('Статьи за @year год.', ['@year' => $year]),
];
}После drush cr адрес /blog/year/2026 покажет «Статьи за 2026 год.». Имя аргумента должно совпадать с именем в скобках: {year} и $year.
Проверка параметра
Сейчас подойдёт и адрес /blog/year/abc. Чтобы маршрут срабатывал только для четырёх цифр, в requirements добавляют регулярное выражение с именем параметра:
# web/modules/custom/blog/blog.routing.yml
requirements:
_permission: 'access content'
year: '\d{4}'Теперь /blog/year/abc вернёт ошибку 404, а метод контроллера не вызовется.
Значение по умолчанию
Если в defaults указать значение параметра, его можно не писать в адресе:
# web/modules/custom/blog/blog.routing.yml
defaults:
_controller: '\Drupal\blog\Controller\BlogController::year'
_title: 'Архив'
year: '2026'Адрес /blog/year откроет архив за 2026 год.
Материал в параметре
Если параметр назвать именем типа сущности, например node, Drupal сам загрузит материал по номеру из адреса:
# web/modules/custom/blog/blog.routing.yml
blog.info:
path: '/blog/{node}/info'
defaults:
_controller: '\Drupal\blog\Controller\BlogController::info'
_title: 'Сведения о статье'
requirements:
_entity_access: 'node.view'// web/modules/custom/blog/src/Controller/BlogController.php
use Drupal\node\NodeInterface;
public function info(NodeInterface $node): array
{
return ['#markup' => $node->label()];
}Адрес /blog/1/info покажет заголовок материала с номером 1. Если такого материала нет, Drupal вернёт 404. Условие _entity_access: 'node.view' пускает только тех, кому разрешено видеть этот материал.
Ссылка с параметром
// в любом классе PHP
use Drupal\Core\Url;
$url = Url::fromRoute('blog.year', ['year' => 2025])->toString(); // /blog/year/2025Значения параметров передают вторым аргументом. В Twig — path('blog.year', {'year': 2025}).
Условия доступа
Запись в requirements | Кому открыта страница |
|---|---|
_permission: 'access content' | Тем, у кого есть это право |
_role: 'administrator' | Пользователям с ролью |
_user_is_logged_in: 'TRUE' | Только вошедшим на сайт |
_entity_access: 'node.update' | Тем, кто может изменять материал из адреса |
_access: 'TRUE' | Всем без проверки |
Свои права объявляют в файле blog.permissions.yml — этому посвящён отдельный урок.
Частая ошибка
Маршрут без условия доступа Drupal считает закрытым: страница отвечает «Доступ запрещён» даже администратору. А запись _access: 'TRUE', которой это «чинят», открывает страницу всем — в том числе служебную. Указывайте конкретное право через _permission, а открытый доступ оставляйте только общедоступным страницам.