簡體   English   中英

Symfony2:每次操作后執行一些代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM