2012-06-22 13 views
9

私は最近Symfony2でプロジェクトを開始しました。コードの冗長性を避けるために、アクションの前後にいくつかのメソッドを実行する必要があります(Zend FrameworkのpreDispatch/postDispatchやSymfony1のPreExecute/PostExecuteなど)。Symfony2:アクションごとにコードを実行

すべてのコントローラが継承された基本クラスを作成しました。 コントローラのpreExecute()メソッドを実行するためのイベントリスナーが登録されていますが、ここからドキュメントや質問をたくさん読んだ後は、 postExecute()を実行する方法を見つける。

はFoo/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(); 
    } 
} 

はFoo/BarBundle /コントローラ/ FooController.php:

class FooController extends BaseController { 
    public function indexAction() { 
    $this->_user->setName('Eric'); 
    $this->_em->persist($this->_user); 
    } 
} 

はFoo/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(); 
     } 
     } 
    } 
    } 
} 

答えて

6

この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); 
    } 
} 
関連する問題