如何在Symfony2中创建类似Zend preDispatch方法的东西

时间:2011-09-03 12:20:30

标签: php symfony action

我正在使用Symfony 2创建一个项目,我需要在Zend中使用类似preDispatch的方法,它将在Controller中的任何操作之前调用。我是Symfony的新手,有点网上冲浪我发现老版本的Symfony中有一个preExecute方法,但现在已经不见了。我可以用什么来解决我的问题?

提前致谢。

2 个答案:

答案 0 :(得分:18)

正如@Arms建议的那样,我已经开始探索Symfony 2的事件机制了。所以现在我要写下代码,这解决了我的问题(我在YAML做的所有配置,但是你可以做它也是XML或PHP)。

首先,您需要在Symfony配置中描述您希望监听哪种事件以及事件发生时内核应该调用的内容。为此,打开配置文件 app \ 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 :(得分:10)

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

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

不幸的是,我不必自己模仿preExecute功能,所以我不确切地知道你需要听什么事件,但我确信通过阅读文档你会弄清楚你需要什么。

希望这有帮助。