Маршруты и контроллеры

Маршрутизация состоит из двух частей:

  1. Роут (маршрут) - содержит информацию о будущей странице, её путь, какой контроллер использовать, заголовок, требования и т.д.
  2. Контроллер - объект, отвечающий за формирование результата по запрошенному маршруту.

Маршруты

Маршруты задаются в специальном файле *.routing.yml, который должен находиться в корне модуля рядом с *.info.yml. Если ваш модуль имеет название foo, в таком случае файл будет называться foo.routing.yml.

В данном файле вы объявляете все необходимые вашему модулю маршруты и описываете их при помощи YAML формата. Например:

foo.content:
  path: '/my-custom-page' 
  defaults: 
    _controller: '\Drupal\foo\Controller\FooController::content' 
    _title: 'Hello World'
  requirements: 
    _permission: 'access content' 
Заметка

В Drupal принято, чтобы маршруты имели название в следующем формате modulename.route_name.

Данный пример объясняет Drupal, что маршрут с названием foo.content должен быть обработан по адресу /my-custom-page. Когда пользователь обратится по данному маршруту, для него будет произведена проверка, имеет ли он доступ access content. Если не имеет, то пользователь получит ответ HTTP 403 "Недостаточно прав", если имеет, тогда результат, который возвращает контроллер. В качестве заголовка страницы будет использована строка "Hello World".

Контроллеры

Drupal 9 использует компонент Symfony - HTTP Kernel, который получает запрос и опрашивает другие системы в надежде получить от них результат, который необходимо вернуть пользователю. Результатом является один из объектов, наследующих Symfony\Component\HttpFoundation\Response или непосредственно данный объект. В случае с Drupal, мы также имеем возможность вернуть render array в качестве результата. Drupal обнаружит его, проведет все необходимые обработки и операции с ним, а затем вернет корректный ответ при помощи Response.

Например, если мы хотим создать контроллер для примера из маршрутизации выше, то результат может быть примерно таким:

<?php

namespace Drupal\foo\Controller;

use Drupal\Core\Controller\ControllerBase;

/**
 * An foo controller.
 */
class FooController extends ControllerBase {

  /**
   * Returns a render-able array for a test page.
   */
  public function content() {
    $build = [
      '#markup' => $this->t('Hello World!'),
    ];
    return $build;
  }

}

В результате чего, Drupal вернет в качестве контента страницы строку "Hello World" на языке пользователя.

Заметка

При помощи Drush, вы можете быстро генерировать код для контроллеров, для этого воспользуйтесь командой drush generate controller.

Ссылки

Помогите нам сделать документацию лучше!

Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.

Редактировать текущий документ Обсудить улучшение

Или узнайте как контрибутить.