Я не вижу здесь никакой причины пересылать запрос обратно через ядро. Вы можете пойти по пути инкапсуляции этой логики в службе проверки, как вы предлагали, или вы можете создать kernel.request
прослушиватель, который запускается после прослушивателя маршрутизатора и применяет атрибут _controller
, только если ваши условия мет.
Например, это routing.yml
:
some_route:
pattern: /xyz
defaults: { _controller_candidate: "FooBundle:Bar:baz" }
А этот слушатель:
class MyListener
{
public function onKernelRequest($event)
{
$request = $event->getRequest();
if (!$controller = $request->attributes->get('_controller_candidiate')) {
return;
}
if (/* your logic... */) {
$request->attributes->set('_controller', $controller');
}
}
}
Настроен для запуска после прослушивателя основного маршрутизатора:
services:
my_listener:
class: MyListener
tags:
-
name: kernel.event_listener
event: kernel.request
priority: -10
Приоритет прослушивателя основного маршрутизатора: 0
в Symfony 2.0 и 32
в Symfony 2.1. В любом случае приоритет -10
должен работать.
Мне любопытно посмотреть, сработает ли это:)