Попытка поменять контроллер с помощью прослушивателя событий с Symfony2 - PullRequest
12 голосов
/ 27 июня 2011

Я читал главу о внутренностях в документации по Symfony2, и там говорится, что если я добавлю прослушиватель для события kernel.controller, я могу поменять контроллер, который запускается, у меня есть кое-что, что работает примерно так:

public function onKernelController(FilterControllerEvent $event)    
{
    $controller = $event->getController();

    $replacementControllerName = .... //Some logic to work out the name of the new controller
    $replacementController = ?? //Not sure what goes here

    $event->setController($replacementController);
}

Бит, в котором я не уверен, если я разобрался с именем заменяющего контроллера, как мне получить его экземпляр, который я могу передать setController?

1 Ответ

18 голосов
/ 27 июня 2011

Вы можете установить свой контроллер на любой вызываемый , что означает что-то вроде

  • Статический метод array('class', 'method')
  • Метод экземпляра array($instance, 'method')
  • Анонимная функция function() { ... }
  • Обычная глобальная функция 'function';
  • Экземпляр класса, реализующий метод __invoke() new MyClassImplementingInvoke()
  • Специальный синтаксис 'class::method', который заставляет ControllerResolver создать новый экземпляр class (вызывая конструктор без каких-либо аргументов) и возвращая вызываемый array($instanceOfClass, 'method')

РЕДАКТИРОВАТЬ:

Я неправильно посмотрел ControllerResolver.При запуске Symfony в стандартной настройке он будет использовать Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver (а не Symfony\Component\HttpKernel\Controller\ControllerResolver).Поэтому имя контроллера будет немного отличаться от того, что я написал выше.

В следующем примере суммируются все возможные варианты, которые вы имеете при настройке контроллера.

public function onKernelController(FilterControllerEvent $event)    
{
    $controller = $event->getController();
    // call method in Controller class in YourBundle
    $replacementController = 'YourBundle:Controller:method';
    // call method in service (which is a service registered in the DIC)
    $replacementController = 'service:method';
    // call method on an instance of Class (created by calling the constructor without any argument)
    $replacementController = 'Class::method';
    // call method on Class statically (static method)
    $replacementController = array('Class', 'method');
    // call method on $controller
    $controller            = new YourController(1, 2, 3);
    $replacementController = array($controller, 'method');
    // call __invoke on $controller
    $replacementController = new YourController(1, 2, 3);
    $event->setController($replacementController);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...