我正在使用的Symfony 2项目的Zend preDispatch方法,我需要有一个像preDispatch在Zend公司将在控制器任何行动之前被调用的方法。我在Symfony中很新,有点上网,我发现在老版本的Symfony中有一个preExecute方法,但现在已经不存在了。我可以用什么来解决我的问题?如何创建一个像在Symfony2中
在此先感谢。
我正在使用的Symfony 2项目的Zend preDispatch方法,我需要有一个像preDispatch在Zend公司将在控制器任何行动之前被调用的方法。我在Symfony中很新,有点上网,我发现在老版本的Symfony中有一个preExecute方法,但现在已经不存在了。我可以用什么来解决我的问题?如何创建一个像在Symfony2中
在此先感谢。
的Symfony 1的preExecute()方法使这个很容易,但就像你说的,它在Symfony2中的不可用。幸运的是,在Symfony2中你可以访问事件。该框架在应用程序的生命周期中分发大量事件。下面是调度的事件的一些列表 - http://symfony.com/doc/2.0/book/internals.html#events。
您还可以使用网页调试工具可以查看正在调度哪些事件,以及类(事件侦听器)正在监听的事件。上面的链接也详细介绍了整个事件系统,以防你不熟悉它。
不幸的是,我自己并不需要模仿preExecute功能,所以我不确切知道你需要听什么事件,但我确定通过阅读文档,你会发现你需要的是什么。
希望这会有所帮助。
作为@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事件,但它可以帮助你理解)
玩得开心;)
非常感谢您的建议,它帮助了我很多。 – haynar