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

hay*_*nar 14 php action symfony

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

提前致谢.

hay*_*nar 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 }
Run Code Online (Sandbox Code Playgroud)

您的类应按以下方式实现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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在每次在控制器中创建preExecute方法之后,它将在执行任何操作之前被调用,因此您可以在该方法中执行大量操作,例如初始化变量或在写入DB之前进行一些检查等等.

您还可以在此处详细了解配置(此示例适用于kernel.request事件,但它可以帮助您理解)

玩得开心 ;)

  • 这篇文章描述了一个类似的方法,但通过实现一个接口,而不是检查method_exists http://matt.drollette.com/2012/06/calling-a-method-before-every-controller-action-in-symfony2/ (3认同)

Ste*_*nte 10

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

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

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

希望这可以帮助.