Dựa trên các đề xuất của @ 4k4 trong phần nhận xét của câu hỏi, tôi đã giải quyết vấn đề này bằng cách triển khai PathProcessor tùy chỉnh.
Tôi sẽ chia sẻ mã tối thiểu để thực hiện công việc này dưới dạng một mô-đun tùy chỉnh (được gọi là term_feed_alias
cho mục đích của ví dụ này) mà bạn cần 3 tệp.
term_feed_alias.info.yml
tên: 'Bí danh nguồn cấp dữ liệu thuật ngữ'
description: 'Cung cấp bí danh tự động cho nguồn cấp dữ liệu thuật ngữ phân loại'
phiên bản: '8.x-1.0'
core_version_requirement: ^8,8 || ^9
loại: mô-đun
phụ thuộc:
- 'path_alias:path_alias'
term_feed_alias.services.yml
dịch vụ:
term_feed_alias.path_processor:
lớp: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
đối số: ['@path_alias.manager']
thẻ:
- { tên: path_processor_inbound }
- { tên: path_processor_outbound }
Các thẻ dịch vụ cũng có thể được ưu tiên, xem https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags
Điều này có thể cần thiết để tích hợp logic bí danh một cách chính xác với các dịch vụ khác như bản dịch chẳng hạn. Cũng xem bình luận đầu tiên của @ 4k4.
scr/PathProcessorFeedAlias.php
<?php
không gian tên Drupal\term_feed_alias\PathProcessor;
sử dụng Drupal\Core\PathProcessor\InboundPathProcessorInterface;
sử dụng Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
sử dụng Drupal\Core\Render\BubbleableMetadata;
sử dụng Drupal\path_alias\AliasManager;
sử dụng Symfony\Thành phần\HttpFoundation\Request;
/**
* Cung cấp bộ xử lý đường dẫn để xử lý bí danh cho nguồn cấp dữ liệu thuật ngữ phân loại.
*/
lớp PathProcessorFeedAlias thực hiện InboundPathProcessorInterface, OutboundPathProcessorInterface {
/**
* Trình quản lý bí danh lưu trữ các tra cứu bí danh dựa trên yêu cầu.
*
* @var \Drupal\path_alias\AliasManager
*/
$aliasManager được bảo vệ;
/**
* Xây dựng một phiên bản PathProcessorFeedAlias mới.
*
* @param \Drupal\path_alias\AliasManager $alias_manager
* Người quản lý bí danh.
*/
hàm công khai __construct(AliasManager $alias_manager) {
$this->aliasManager = $alias_manager;
}
/**
* {@inheritdoc}
*/
chức năng công khai processInbound($path, Request $request) {
$args = phát nổ('/', trim($path, '/'));
if (end($args) == 'feed') {
mảng_pop($args);
$system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
return $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $system_path . '/feed' : $path;
}
trả về đường dẫn $;
}
/**
* {@inheritdoc}
*/
chức năng công khai processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
$args = phát nổ('/', ltrim($path, '/'));
if ($args[0] == 'phân loại' && $args[1] == 'term' && end($args) == 'feed') {
mảng_pop($args);
$alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
trở lại '/' . $bí danh . '/cho ăn';
}
trả về đường dẫn $;
}
}