Trying to swap a controller using an event listener with Symfony2
You can set your controller to any callable, which means something like
- A static method
array('class', 'method')
- An instance method
array($instance, 'method')
- An anonymous function
function() { ... }
- A regular global function
'function'
; - An instance of a class implementing the
__invoke()
methodnew MyClassImplementingInvoke()
- The special syntax
'class::method'
which forces theControllerResolver
to create a new instance ofclass
(calling the constructor without any argument) and returning a callablearray($instanceOfClass, 'method')
EDIT:
I looked up the wrong ControllerResolver
. When running Symfony in a standard setup it'll use the Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver
(and not the Symfony\Component\HttpKernel\Controller\ControllerResolver
). So the controller name will be handled a little bit different to what I wrote above.
The following example sums up all the possible options you have when setting your controller.
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);}