2011-09-03 50 views
14

我正在使用的Symfony 2项目的Zend preDispatch方法,我需要有一个像preDispatch在Zend公司将在控制器任何行动之前被调用的方法。我在Symfony中很新,有点上网,我发现在老版本的Symfony中有一个preExecute方法,但现在已经不存在了。我可以用什么来解决我的问题?如何创建一个像在Symfony2中

在此先感谢。

回答

10

的Symfony 1的preExecute()方法使这个很容易,但就像你说的,它在Symfony2中的不可用。幸运的是,在Symfony2中你可以访问事件。该框架在应用程序的生命周期中分发大量事件。下面是调度的事件的一些列表 - http://symfony.com/doc/2.0/book/internals.html#events

您还可以使用网页调试工具可以查看正在调度哪些事件,以及类(事件侦听器)正在监听的事件。上面的链接也详细介绍了整个事件系统,以防你不熟悉它。

不幸的是,我自己并不需要模仿preExecute功能,所以我不确切知道你需要听什么事件,但我确定通过阅读文档,你会发现你需要的是什么。

希望这会有所帮助。

+0

非常感谢您的建议,它帮助了我很多。 – haynar

18

作为@Arms建议我,我已经开始探索Symfony 2的事件机制。所以现在我要写下代码,解决了我的问题(我在YAML中执行的所有配置,但可以用XML或PHP来做)。

起初,你需要在你喜欢听和事件发生时的内核应该叫什么什么样的事件Symfony的配置来形容。对于本打开配置文件应用程序\ CONFIG \ config.yml并添加以下代码:

services: 
    younamespace.yourbundle.listener.preexecute: 
     class: Location\Of\Your\Listener\Class 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

你的类应该实现以下方式onKernelController方法:

public function onKernelController(FilterControllerEvent $event) { 
    if(HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { 
     $controllers = $event->getController(); 
     if(is_array($controllers)) { 
      $controller = $controllers[0]; 

      if(is_object($controller) && method_exists($controller, 'preExecute')) { 
       $controller->preExecute(); 
      } 
     } 
    } 
} 

这之后的每当你创建你的控制器preExecute方法时,它会在执行任何操作之前被调用,这样你就可以写DB等之前做很多东西,在该方法中,像初始化变量,或一些检查。

您还可以查看详细here配置(本例中是kernel.request事件,但它可以帮助你理解)

玩得开心;)

+1

注意,控制器可以是一个封闭,所以你应该检查'is_array()'对数组的第一个项目中的控制器和'is_object()'上。 – igorw

+0

是:)你是对的 – haynar

+2

+1非常好的解决方案和解释! –