尝试使用带有Symfony2的事件侦听器交换控制器
我一直在阅读Symfony2文档中的“内部”一章,它说如果我在kernel.controller事件中添加一个侦听器,我可以交换运行的控制器,我得到的一些东西有点像这样:尝试使用带有Symfony2的事件侦听器交换控制器,symfony,Symfony,我一直在阅读Symfony2文档中的“内部”一章,它说如果我在kernel.controller事件中添加一个侦听器,我可以交换运行的控制器,我得到的一些东西有点像这样: public function onKernelController(FilterControllerEvent $event) { $controller = $event->getController(); $replacementControllerName = .... //Some l
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?您可以将控制器设置为任何可调用的,这意味着
- 静态方法
数组('class','method')
- 实例方法
数组($instance,'method')
- 匿名函数
function(){…}
- 常规全局函数
李>“函数”
- 实现方法
new MyClassImplementingInvoke()
- 特殊语法
强制创建'class::method'
的新实例(不带任何参数调用构造函数)并返回可调用的类
数组($instanceOfClass'method')
控制器Resolver
。在标准设置中运行Symfony时,它将使用(而不是)。因此,控制器名称的处理方式将与我上面所写的略有不同
以下示例总结了设置控制器时所有可能的选项
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);
}
感谢您的回复,但我仍然很难让某些东西正常工作,这些选项中的哪一个是获得控制器设置的最佳方式,这样它就可以像Symfony创建的一样正常工作?抱歉,我可能很愚蠢,但我仍然不确定如何使其正常工作,您可以发布一些示例代码吗?我有点困惑,因为我认为class::method总是引用静态方法,所以我看不出它们会如何触发ControllerResolver来做任何事情。请查看
ControllerResolver
类中的createController()
方法和Symfony\Component\HttpKernel\Controller\ControllerResolver
中的getController()
方法,了解这是如何工作的。感谢您的帮助,我认为这已经开始工作了。我必须向我的控制器添加一个getContainer()方法,这样我才能将容器添加到新控制器中,但它现在似乎正在工作。该方法(“bundle:controller:method”)在最新的2.0.10版本中仍然有效吗?我无法让它工作:看()