尝试使用带有Symfony2的事件侦听器交换控制器

尝试使用带有Symfony2的事件侦听器交换控制器,symfony,Symfony,我一直在阅读Symfony2文档中的“内部”一章,它说如果我在kernel.controller事件中添加一个侦听器,我可以交换运行的控制器,我得到的一些东西有点像这样: public function onKernelController(FilterControllerEvent $event) { $controller = $event->getController(); $replacementControllerName = .... //Some l

我一直在阅读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?

您可以将控制器设置为任何可调用的,这意味着

  • 静态方法
    数组('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版本中仍然有效吗?我无法让它工作:看()