[英]Symfony2: Execute some code after every action
我最近在Symfony2中啟動了一個項目,我需要在每個操作之前和之后運行一些方法以避免代碼冗余(例如來自Zend Framework的preDispatch / postDispatch和來自Symfony1的PreExecute / PostExecute)。
我創建了一個繼承所有控制器的基類,並在運行請求的操作之前注冊了一個事件監聽器來運行控制器的preExecute()方法,但是在閱讀了大量的文檔和問題后,我仍然無法找到如何運行postExecute ()。
美孚/ BarBundle /控制器/ 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();
}
}
美孚/ BarBundle /控制器/ FooController.php:
class FooController extends BaseController {
public function indexAction() {
$this->_user->setName('Eric');
$this->_em->persist($this->_user);
}
}
美孚/ BarBundle /事件監聽/ 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();
}
}
}
}
}
有這樣一個討論, 在這里 ,並通過這個特殊的例子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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.