Inbound Processor и Outbound Processor — сервисы с меткой path_processor_inbound и path_processor_outbound позволяющие программно обрабатывать входящие и исходящие пути сайта.
¶Введение
Inbound и Outbound обработчики используются Drupal для определения адреса, по которому обращается пользователь, а также, конвертирует исходящие системные адреса в необходимый вид.
Drupal и его API для маршрутизации всегда работают с внутренними системными путями. Но системные пути не всегда красивы и понятны, поэтому применяются ЧПУ или задаются синонимы путей. Inbound и Outbound обработчики отвечают за этот процесс.
Задача данных обработчиков - конвертировать исходящие системные пути в более понятные для пользователя и входящие в системные, которые понятны Drupal и коду.
Таким образом Drupal и код работают с системными адресами, независимо от того что видит в конечном итоге пользователь. Благодаря данным «посредникам», синонимы путей не конфликтуют с системными и предоставляется больше свободы для настройки путей.
¶Outbound Processor — исходящие пути
Outbound Processor (path_processor_outbound) — обработчик исходящих путей сайта. Задача данного обработчика, конвертировать системный путь в более человекопонятный. Например путь /node/123 превратить в /about. Таким образом, все ссылки ведущие на /node/123 будут автоматически конвертироваться в /about.
¶Создание Outbound Processor
Для реализации Outbound Processor необходимо чтобы класс сервиса реализовывал Drupal\Core\PathProcessor\OutboundPathProcessorInterface. Данный интерфейс требует реализовать метод ::processOutbound со следующими параметрами:
-
$path: Текущий путь который проходит обработку. Из примера это/node/123. -
$options: Массив опций для URL.-
'query': Массив параметров для пути (query). -
'fragment': Фрагмент пути — якорь (#foo-bar). -
'absolute': Логический индикатор должен ли сгенерированный путь быть абсолютным. По умолчаниюFALSEесли не заданого иного. -
'language': Объект с языком для которого генерируется путь. Если данное значение отсутствует, значит путь генерируется для текущего активного языка. -
'https': Логический индикатор, должен ли путь быть принудительно с HTTPS протоколом. По умолчанию используется текущий протокол. -
'base_url': Базовый URL сайта — домен (example.com). Позволяет поменять домен. Например если для разных языков используются разные домены. -
'prefix': Префикс базового URL сайта — поддомен (foo.example.com). Позволяет скорректировать префикс пути. Например если для разных языков используются разные поддомены. -
'route': Объект маршрута для текущего$path.
-
-
$request: Объект текущего запроса. -
$bubbleable_metadata: Объект для сбора кеш-метаданных.
Метод должен вернуть путь который будет использоваться в URL.
Пример конвертации /node/123 в /about:
services:
example.example_outbound_processor:
class: Drupal\example\PathProcessor\ExampleOutboundProcessor
tags:
- { name: path_processor_outbound }
<?php
namespace Drupal\example\PathProcessor;
use Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Symfony\Component\HttpFoundation\Request;
/**
* Provides custom outbound processor.
*/
final class ExampleOutboundProcessor implements OutboundPathProcessorInterface {
/**
* {@inheritdoc}
*/
public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
if ($path == '/node/123') {
$path = '/about';
}
return $path;
}
}
¶Inbound Processor — входящие пути
Inbound Processor (path_processor_inbound) — обработчик входящих путей сайта. Задача данного обработчика, конвертировать входящий человекопонятный путь в системный. Например путь /about превратить в /node/123. Таким образом, все входящие запросы на /about «внутри» будут трактованы как /node/123, система маршрутизации найдёт системный путь /node/{nid} и корректно вызовет все обработчики для страницы. Это позволяет бэкенд логике не опираться на нестабильные пути, а всегда работать с системными.
¶Создание Inbound Processor
Для реализации Inbound Processor необходимо чтобы класс сервиса реализовывал Drupal\Core\PathProcessor\InboundPathProcessorInterface. Данный интерфейс требует реализовать метод ::processInbound со следующими параметрами:
-
$path: Текущий путь который проходит обработку. Из примера это/about. -
$request: Объект текущего запроса.
Метод должен вернуть системный путь чтобы Drupal понял как его обрабатывать.
Пример конвертации /about в /node/123
services:
example.example_inbound_processor:
class: Drupal\example\PathProcessor\ExampleInboundProcessor
tags:
- { name: path_processor_inbound }
<?php
namespace Drupal\example\PathProcessor;
use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* Provides custom inbound processor.
*/
final class ExampleInboundProcessor implements InboundPathProcessorInterface {
/**
* {@inheritdoc}
*/
public function processInbound($path, Request $request) {
if ($path == '/about') {
$path = '/node/123';
}
return $path;
}
}
¶Модуль Path Alias
Drupal предоставляет стандартный модуль Path Alias (path_alias), который реализует систему алиасов и ЧПУ (сервис path_alias.path_processor).
Данный модуль создаёт специальную сущность в которой хранит соответствия системного пути и алиаса для него. Затем, при входящих и исходящих запросах он, на основе данных соответствий конвертирует пути в обе стороны.
Так, задав материалу /node/123, через административный интерфейс, синоним /about, он будет сохранён и проходить через эти обработки.
¶Ссылки
- Drupal 8: Inbound и Outbound Processor, Niklan, 2018.
- Программная реализация ЧПУ, xandeadx, 2020.