【发布时间】:2011-09-03 12:20:30
【问题描述】:
我正在使用 Symfony 2 制作项目,我需要在 Zend 中使用 preDispatch 之类的方法,该方法将在控制器中的任何操作之前调用。我是 Symfony 的新手,上网浏览了一下,我发现旧版本的 Symfony 中有一个 preExecute 方法,但现在它已经消失了。我可以用什么来解决我的问题?
提前致谢。
【问题讨论】:
我正在使用 Symfony 2 制作项目,我需要在 Zend 中使用 preDispatch 之类的方法,该方法将在控制器中的任何操作之前调用。我是 Symfony 的新手,上网浏览了一下,我发现旧版本的 Symfony 中有一个 preExecute 方法,但现在它已经消失了。我可以用什么来解决我的问题?
提前致谢。
【问题讨论】:
正如@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()。
Symfony 1 的 preExecute() 方法使这变得非常简单,但就像你说的,它在 Symfony2 中不可用。幸运的是,在 Symfony2 中,您可以访问事件。该框架在应用程序的生命周期中调度大量事件。这是一些已调度事件的列表 - http://symfony.com/doc/2.0/book/internals.html#events。
您还可以使用 Web 调试工具栏来查看正在调度的事件以及正在侦听事件的类 (EventListeners)。如果您不熟悉,上面的链接还详细介绍了整个事件系统。
不幸的是,我自己不必模仿 preExecute 功能,所以我不知道你需要听什么事件,但我相信通过阅读文档你会确切地知道你需要什么。
希望这会有所帮助。
【讨论】: