php - Symfony2 : Execute some code after every action

标签 php symfony

我最近在 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/

相关文章:

php - 如何处理大型帖子请求

php - 如何通过 PHP 检索访问者的 ISP?

php - 如何解决 `SameSite`属性

javascript - 在 highchart 系列的点击事件中使用带有参数的 symfony 路由

php - 如何在 Symfony2 中使用供应商捆绑资源

php - 参数 - 此服务的最佳实践

php - PHP 5.2 中的 DOMDocument::saveHTML($domnode)?

javascript - vue js 不要按键排序数组

symfony - Payum/ Paypal 结账 : What to do after redirecting me to done action

php - __DIR__ VS 使用反射