2011-09-03 86 views
14

我正在使用的Symfony 2項目的Zend preDispatch方法,我需要有一個像preDispatch在Zend公司將在控制器任何行動之前被調用的方法。我在Symfony中很新,有點上網,我發現在老版本的Symfony中有一個preExecute方法,但現在已經不存在了。我可以用什麼來解決我的問題?如何創建一個像在Symfony2中

在此先感謝。

回答

10

的Symfony 1的preExecute()方法使這個很容易,但就像你說的,它在Symfony2中的不可用。幸運的是,在Symfony2中你可以訪問事件。該框架在應用程序的生命週期中分發大量事件。下面是調度的事件的一些列表 - http://symfony.com/doc/2.0/book/internals.html#events

您還可以使用網頁調試工具可以查看正在調度哪些事件,以及類(事件偵聽器)正在監聽的事件。上面的鏈接也詳細介紹了整個事件系統,以防你不熟悉它。

不幸的是,我自己並不需要模仿preExecute功能,所以我不確切知道你需要聽什麼事件,但我確定通過閱讀文檔,你會發現你需要的是什麼。

希望這會有所幫助。

+0

非常感謝您的建議,它幫助了我很多。 – haynar

18

作爲@Arms建議我,我已經開始探索Symfony 2的事件機制。所以現在我要寫下代碼,解決了我的問題(我在YAML中執行的所有配置,但可以用XML或PHP來做)。

起初,你需要在你喜歡聽和事件發生時的內核應該叫什麼什麼樣的事件Symfony的配置來形容。對於本打開配置文件應用程序\ CONFIG \ config.yml並添加以下代碼:

services: 
    younamespace.yourbundle.listener.preexecute: 
     class: Location\Of\Your\Listener\Class 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

你的類應該實現以下方式onKernelController方法:

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

這之後的每當你創建你的控制器preExecute方法時,它會在執行任何操作之前被調用,這樣你就可以寫DB等之前做很多東西,在該方法中,像初始化變量,或一些檢查。

您還可以查看詳細here配置(本例中是kernel.request事件,但它可以幫助你理解)

玩得開心;)

+1

注意,控制器可以是一個封閉,所以你應該檢查'is_array()'對數組的第一個項目中的控制器和'is_object()'上。 – igorw

+0

是:)你是對的 – haynar

+2

+1非常好的解決方案和解釋! –