I’ve been reading through the internals chapter in the Symfony2 docs and it says if I add a listener to the kernel.controller event I can swap the controller that gets run, I’ve got something that works a bit like this:
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);
}
The bit I’m unsure if is once I’ve worked out the name of the replacement controller, how do I get an instance of it that I can pass to setController?
You can set your controller to any callable, which means something like
array('class', 'method')array($instance, 'method')function() { ... }'function';__invoke()methodnew MyClassImplementingInvoke()'class::method'which forces theControllerResolverto 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 theSymfony\Bundle\FrameworkBundle\Controller\ControllerResolver(and not theSymfony\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.