Encodera

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

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

Оглавление

Параметры и доступ к маршруту

Параметр маршрута — изменяемая часть адреса: год в /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, а открытый доступ оставляйте только общедоступным страницам.

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

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