2012-06-22 12 views
9

Kısa bir süre önce Symfony2'de bir proje başlattım ve kod geri yüklemesinden kaçınmak için her eylemden önce ve sonra bazı yöntemleri çalıştırmam gerekiyor (Zend Framework ve Preposecute/PostExecute from Symfony1'den önDispatch/postDispatch gibi).Symfony2: Her eylemden sonra bir kod yürütün

Tüm denetleyicilerin miras aldığı bir temel sınıf oluşturdum, ve istenen eylemi çalıştırmadan önce denetleyicinin preExecute() yöntemini çalıştırmak için bir olay dinleyicisi kaydettim, ancak burada belge ve soruları okuduktan sonra hala yapamıyorum postExecute() öğesini nasıl çalıştıracağınızı öğrenin.

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

cevap

6

Bu here ile ilgili bir tartışma var ve bu özel örnek schmittjoh tarafından size doğru yönde yol açabilir.

<?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); 
    } 
} 
İlgili konular