我最近在 Symfony2 中启动了一个项目,我需要在每个操作之前和之后运行一些方法以避免代码冗余(例如 Zend Framework 的 preDispatch/postDispatch 和 Symfony1 的 PreExecute/PostExecute)。
我创建了一个基类,所有 Controller 都继承自该基类, 并注册了一个事件监听器以在运行请求的操作之前运行 Controller 的 preExecute() 方法,但是在阅读了大量文档和此处的问题之后我仍然找不到如何运行 postExecute()。
Foo/BarBundle/Controller/BaseController.php:
class BaseController extends Controller {
protected $_user;
protected $_em;
public function preExecute() {
$user = $this->get('security.context')->getToken()->getUser();
$this->_user = $user instanceof User ? $user : null;
$this->_em = $this->getDoctrine()->getEntityManager();
}
public function postExecute() {
$this->_em->flush();
}
}
Foo/BarBundle/Controller/FooController.php:
class FooController extends BaseController {
public function indexAction() {
$this->_user->setName('Eric');
$this->_em->persist($this->_user);
}
}
Foo/BarBundle/EventListener/PreExecute.php:
class PreExecute {
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();
}
}
}
}
}
最佳答案
有人讨论这个here和这个特殊的例子 schmittjoh可能会引导您朝着正确的方向前进。
<?php
class Listener
{
public function onKernelController($event)
{
$currentController = $event->getController();
$newController = function() use ($currentController) {
// pre-execute
$rs = call_user_func_array($currentController, func_get_args());
// post-execute
return $rs;
};
$event->setController($newController);
}
}
关于php - Symfony2 : Execute some code after every action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163512/