Да, это правильный подход. Вам не нужен оператор else. Если вы не задаете ответ, распространение события не останавливается, и подписчики событий с более низким приоритетом получают возможность задать ответ. Приоритет зависит от $value. В вашем вопросе неясно, но если это не зависит ни от чего конкретного Drupal, установите приоритет> 300.
Лучшей практикой является использование кешируемого ответа и добавление любых зависимостей $value к ответу. Если у вас их нет, все равно используйте этот ответ. Это говорит Drupal, что вы согласны с тем, что он кэшируется, как вы хотите перенаправить этот путь.
Пример:
core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
<?php
пространство имен Drupal\Core\EventSubscriber;
используйте Drupal\Core\Cache\CacheableRedirectResponse;
используйте Symfony\Component\HttpKernel\Event\RequestEvent;
используйте Symfony\Component\HttpKernel\KernelEvents;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Перенаправляет пути, начинающиеся с нескольких косых черт, на одну косую черту.
*/
class RedirectLeadingSlashesSubscriber реализует EventSubscriberInterface {
/**
* Перенаправляет пути, начинающиеся с нескольких косых черт, на одну косую черту.
*
* @param\Symfony\Component\HttpKernel\Event\RequestEvent $event
* RequestEvent для обработки.
*/
перенаправление публичной функции (RequestEvent $event) {
$запрос = $event->getRequest();
// Получить запрошенный путь минус базовый путь.
$path = $request->getPathInfo();
// Невозможно создать ссылку или маршрут к пути, начинающемуся с
// несколько ведущих косых черт. Однако, если на страницу 404 добавлена форма, которая
// отправляет обратно на тот же URI, что представляет собой открытое перенаправление
// уязвимость. Кроме того, Drupal 7 отображает одну и ту же страницу для
// http://www.example.org/foo и http://www.example.org////foo.
если (strpos($path, '//') === 0) {
$путь = '/' . ltrim($путь, '/');
$qs = $request->getQueryString();
если ($qs) {
$qs = '?' . $ кв;
}
$event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path). $qs));
}
}
/**
* {@inheritdoc}
*/
общедоступная статическая функция getSubscribedEvents() {
$events[KernelEvents::REQUEST][] = ['redirect', 1000];
вернуть $события;
}
}
Если $value специфично для Drupal, например, вы получаете его от сущности, используйте приоритет по умолчанию 0 и установите сущность как зависимость кэша. В этом случае вам нужно установить заголовки ответа, чтобы браузер не кэшировал результат перенаправления для этого пути. Использовать LocalRedirectResponse для местных или TrustedRedirectResponse для внешних URL. Смотрите этот отличный ответ Отключение кеша страницы для ответа на перенаправление