Ответ 1
Вы можете установить ваш контроллер на любой вызываемый, что означает что-то вроде
- Статический метод
array('class', 'method')
- Метод экземпляра
array($instance, 'method')
- Анонимная функция
function() { ... }
- Регулярная глобальная функция
'function'
; - Пример класса, реализующего метод
__invoke()
new MyClassImplementingInvoke()
- Специальный синтаксис
'class::method'
, который заставляетControllerResolver
создать новый экземплярclass
(вызов конструктора без каких-либо аргументов) и возвращение вызываемогоarray($instanceOfClass, 'method')
EDIT:
Я искал неправильный 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);
}