ตามคำแนะนำโดย @ 4k4 ในส่วนความคิดเห็นของคำถาม ฉันได้แก้ไขปัญหานี้โดยใช้ PathProcessor ที่กำหนดเอง
ฉันจะแบ่งปันรหัสขั้นต่ำเปล่าสำหรับการทำงานนี้ในรูปแบบของโมดูลที่กำหนดเอง (เรียกว่า term_feed_alias
สำหรับจุดประสงค์ของตัวอย่างนี้) ซึ่งคุณต้องการ 3 ไฟล์
term_feed_alias.info.yml
ชื่อ: 'นามแฝงฟีดคำ'
คำอธิบาย: 'ให้นามแฝงอัตโนมัติสำหรับฟีดคำศัพท์อนุกรมวิธาน'
รุ่น: '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 = ระเบิด ('/', ตัดแต่ง ($ เส้นทาง, '/'));
ถ้า (สิ้นสุด ($ args) == 'ฟีด') {
array_pop($args);
$system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
ส่งคืน $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $system_path '/feed' : $เส้นทาง;
}
ส่งคืน $path;
}
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ processOutbound ($path, &$options = [], ร้องขอ $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
$args = ระเบิด ('/', ltrim ($ เส้นทาง, '/'));
if ($args[0] == 'taxonomy' && $args[1] == 'term' && end($args) == 'feed') {
array_pop($args);
$alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
กลับ '/' . $นามแฝง. '/ให้อาหาร';
}
ส่งคืน $path;
}
}