Da, aceasta este o abordare corectă. Nu aveți nevoie de o altă declarație. Dacă nu setați un răspuns, propagarea evenimentului nu se oprește, iar abonații la eveniment cu o prioritate mai mică au șansa de a seta un răspuns. Prioritatea depinde de $value. Nu este clar în întrebarea dvs., dar dacă nu depinde de nimic specific Drupal, atunci setați o prioritate >300.
Cea mai bună practică este să folosiți un răspuns stocabil în cache și să adăugați orice dependențe de $value la răspuns. Dacă nu aveți niciunul, folosiți totuși acest răspuns. Îi spune lui Drupal că sunteți în regulă că este stocat în cache cum doriți să redirecționați această cale.
Exemplu:
core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
<?php
spațiu de nume Drupal\Core\EventSubscriber;
utilizați Drupal\Core\Cache\CacheableRedirectResponse;
utilizați Symfony\Component\HttpKernel\Event\RequestEvent;
utilizați Symfony\Component\HttpKernel\KernelEvents;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;
clasa RedirectLeadingSlashesSubscriber implementează EventSubscriberInterface {
redirecționare funcție publică(RequestEvent $event) {
$cerere = $eveniment->getRequest();
$cale = $cerere->getPathInfo();
if (strpos($cale, '//') === 0) {
$cale = '/' . ltrim($cale, '/');
$qs = $request->getQueryString();
dacă ($qs) {
$qs = '?' . $qs;
}
$event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
}
}
funcție publică statică getSubscribedEvents() {
$events[KernelEvents::REQUEST][] = ['redirect', 1000];
returnează $evenimente;
}
}
Dacă $value este specific Drupal, de exemplu îl obțineți de la o entitate, utilizați prioritatea implicită 0 și setați entitatea ca dependență de cache. În acest caz, trebuie să setați anteturi de răspuns pentru a preveni ca browserul să memoreze în cache rezultatul redirecționării pentru această cale. Utilizare LocalRedirectResponse pentru local sau TrustedRedirectResponse pentru adrese URL externe. Vezi acest răspuns grozav Dezactivarea memoriei cache a paginii pentru răspunsul de redirecționare