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

pog*_*ogo 12 symfony

我一直在阅读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);
}
Run Code Online (Sandbox Code Playgroud)

我不确定是否曾经找到替换控制器的名称,我如何得到一个可以传递给setController的实例?

Ste*_*rig 18

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

  • 静态方法 array('class', 'method')
  • 实例方法 array($instance, 'method')
  • 一个匿名函数 function() { ... }
  • 定期的全球职能'function';
  • 实现该__invoke()方法的类的实例new MyClassImplementingInvoke()
  • 'class::method'强制ControllerResolver创建新实例class(调用不带任何参数的构造函数)并返回可调用的特殊语法array($instanceOfClass, 'method')

编辑:

我查了错了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);
}
Run Code Online (Sandbox Code Playgroud)