Pe baza sugestiilor de la @4k4 din secțiunea de comentarii a întrebării, am rezolvat această problemă prin implementarea unui PathProcessor personalizat.
Voi împărtăși codul minim necesar pentru ca acest lucru să funcționeze sub forma unui modul personalizat (numit term_feed_alias
în scopul acestui exemplu) pentru care aveți nevoie de 3 fișiere.
term_feed_alias.info.yml
nume: „Alias de feed de termen”
descriere: „Oferă aliasuri automate pentru fluxurile de termeni de taxonomie”
versiunea: „8.x-1.0”
cerinta_versiune_core: ^8.8 || ^9
tip: modul
dependențe:
- 'path_alias:path_alias'
term_feed_alias.services.yml
Servicii:
term_feed_alias.path_processor:
clasa: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
argumente: ['@path_alias.manager']
Etichete:
- { nume: path_processor_inbound }
- { nume: path_processor_outbound }
Etichetele de serviciu pot primi, de asemenea, o prioritate, vezi https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags
Acest lucru ar putea fi necesar pentru a integra corect logica alias cu alte servicii, cum ar fi traducerile, de exemplu. Vedeți și primul comentariu al lui @4k4.
scr/PathProcessorFeedAlias.php
<?php
spațiu de nume Drupal\term_feed_alias\PathProcessor;
utilizați Drupal\Core\PathProcessor\InboundPathProcessorInterface;
utilizați Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
utilizați Drupal\Core\Render\BubbleableMetadata;
utilizați Drupal\path_alias\AliasManager;
utilizați Symfony\Component\HttpFoundation\Request;
/**
* Furnizați un procesor de cale pentru a gestiona aliasurile pentru fluxurile de termeni de taxonomie.
*/
clasa PathProcessorFeedAlias implementează InboundPathProcessorInterface, OutboundPathProcessorInterface {
/**
* Managerul de alias care memorează în cache căutările de alias pe baza solicitării.
*
* @var \Drupal\path_alias\AliasManager
*/
protejat $aliasManager;
/**
* Construiește o nouă instanță PathProcessorFeedAlias.
*
* @param \Drupal\path_alias\AliasManager $alias_manager
* Managerul de alias.
*/
funcția publică __construct(AliasManager $alias_manager) {
$this->aliasManager = $alias_manager;
}
/**
* {@inheritdoc}
*/
funcția publică proces Intrare($cale, Solicitare $cerere) {
$args = explode('/', trim($cale, '/'));
if (end($args) == 'feed') {
array_pop($args);
$system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
returnează $cale_sistem && strpos($cale_sistem, '/taxonomie/termen/') === 0 ? $cale_sistem . '/feed': $cale;
}
returnează $cale;
}
/**
* {@inheritdoc}
*/
funcția publică processOutbound($cale, &$opțiuni = [], Solicitare $cerere = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
$args = explode('/', ltrim($cale, '/'));
if ($args[0] == 'taxonomie' && $args[1] == 'termen' && end($args) == 'feed') {
array_pop($args);
$alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
întoarcere '/' . $alias . '/a hrani';
}
returnează $cale;
}
}