Маршрутизация состоит из двух частей:
- Роут (маршрут) - содержит информацию о будущей странице, её путь, какой контроллер использовать, заголовок, требования и т.д.
- Контроллер - объект, отвечающий за формирование результата по запрошенному маршруту.
¶Маршруты
Маршруты задаются в специальном файле *.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, что маршрут с названием foo.content
должен быть обработан по адресу /my-custom-page
. Когда пользователь обратится по данному маршруту, для него будет произведена проверка, имеет ли он доступ access content
. Если не имеет, то пользователь получит ответ HTTP 403 "Недостаточно прав", если имеет, тогда результат, который возвращает контроллер. В качестве заголовка страницы будет использована строка "Hello World".
¶Контроллеры
Drupal 8 использует компонент 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" на языке пользователя.
¶Ссылки
- Drupal 8 Hello World: Пишем свой первый модуль, Niklan, 2014