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;
/**
* Redirecționează căile care încep cu mai multe bare oblice către o singură bară.
*/
clasa RedirectLeadingSlashesSubscriber implementează EventSubscriberInterface {
/**
* Redirecționează căile care încep cu mai multe bare oblice către o singură bară.
*
* @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
* RequestEvent de procesat.
*/
redirecționare funcție publică(RequestEvent $event) {
$cerere = $eveniment->getRequest();
// Obține calea solicitată minus calea de bază.
$cale = $cerere->getPathInfo();
// Este imposibil să creezi o legătură sau o rută către o cale începând cu
// mai multe bare oblice. Cu toate acestea, dacă se adaugă un formular la pagina 404, acesta
// trimite înapoi la același URI, aceasta prezintă o redirecționare deschisă
// vulnerabilitate. De asemenea, Drupal 7 redă aceeași pagină pentru
// http://www.example.org/foo și http://www.example.org////foo.
if (strpos($cale, '//') === 0) {
$cale = '/' . ltrim($cale, '/');
$qs = $request->getQueryString();
dacă ($qs) {
$qs = '?' . $qs;
}
$event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
}
}
/**
* {@inheritdoc}
*/
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