【问题标题】:How to create a something like Zend preDispatch method in Symfony2如何在 Symfony2 中创建类似 Zend preDispatch 方法
【发布时间】:2011-09-03 12:20:30
【问题描述】:

我正在使用 Symfony 2 制作项目,我需要在 Zend 中使用 preDispatch 之类的方法,该方法将在控制器中的任何操作之前调用。我是 Symfony 的新手,上网浏览了一下,我发现旧版本的 Symfony 中有一个 preExecute 方法,但现在它已经消失了。我可以用什么来解决我的问题?

提前致谢。

【问题讨论】:

    标签: php symfony action


    【解决方案1】:

    正如@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事件的,不过可以帮助你理解)

    玩得开心;)

    【讨论】:

    • 请注意,控制器可能是一个闭包,因此您应该检查控制器上的is_array() 和该数组的第一项上的is_object()
    • 这篇文章描述了一个类似的方法,但是通过实现一个接口而不是检查 method_exists matt.drollette.com/2012/06/…
    • @MDrollette 非常好的解决方案 :) 感谢您的反馈
    • 如果您想在 pre-行动。很好的解决方案!谢谢!
    【解决方案2】:

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您的建议,对我帮助很大。
    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多