Основываясь на предложениях @4k4 в разделе комментариев к вопросу, я решил эту проблему, внедрив собственный PathProcessor.
Я поделюсь минимальным кодом для выполнения этой работы в виде пользовательского модуля (называемого term_feed_alias
для этого примера), для которого вам нужно 3 файла.
term_feed_alias.info.yml
name: 'Псевдоним фида терминов'
description: «Предоставляет автоматические псевдонимы для фидов терминов таксономии»
версия: '8.x-1.0'
core_version_requirement: ^8.8 || ^9
тип: модуль
зависимости:
- 'Псевдоним_пути:псевдоним_пути'
term_feed_alias.services.yml
Сервисы:
term_feed_alias.path_processor:
класс: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
аргументы: ['@path_alias.manager']
теги:
- {имя: path_processor_inbound}
- {имя: path_processor_outbound}
Служебные теги также могут получать приоритет, см. https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags
Это может понадобиться для правильной интеграции логики псевдонимов с другими службами, такими как, например, переводы. Также см. первый комментарий @4k4.
scr/PathProcessorFeedAlias.php
<?php
пространство имен Drupal\term_feed_alias\PathProcessor;
используйте Drupal\Core\PathProcessor\InboundPathProcessorInterface;
используйте Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
используйте Drupal\Core\Render\BubbleableMetadata;
используйте Drupal\path_alias\AliasManager;
используйте Symfony\Component\HttpFoundation\Request;
/**
* Обеспечьте обработчик пути для обработки псевдонимов для фидов терминов таксономии.
*/
класс PathProcessorFeedAlias реализует InboundPathProcessorInterface, OutboundPathProcessorInterface {
/**
* Диспетчер псевдонимов, кэширующий поиск псевдонимов на основе запроса.
*
* @var \Drupal\path_alias\AliasManager
*/
защищенный $aliasManager;
/**
* Создает новый экземпляр PathProcessorFeedAlias.
*
* @param \Drupal\path_alias\AliasManager $alias_manager
* Менеджер псевдонимов.
*/
общедоступная функция __construct(AliasManager $alias_manager) {
$this->aliasManager = $alias_manager;
}
/**
* {@inheritdoc}
*/
общедоступная функция processInbound ($ путь, запрос $ запрос) {
$args = взорвать ('/', обрезать ($ path, '/'));
если (конец ($ args) == 'канал') {
массив_поп ($ аргументы);
$system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
вернуть $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $системный_путь . '/канал': $путь;
}
вернуть $путь;
}
/**
* {@inheritdoc}
*/
публичная функция processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
$args = взорвать('/', ltrim($path, '/'));
if ($args[0] == 'таксономия' && $args[1] == 'term' && end($args) == 'канал') {
массив_поп ($ аргументы);
$alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
возвращаться '/' . $ псевдоним . '/подача';
}
вернуть $путь;
}
}