2014-10-28 45 views
4

我想檢查,如果用戶登錄 - 行動被調用之前。Symfony 2:如何在每個控制器操作之前觸發代碼?

對於Symfony\Bundle\FrameworkBundle\Controller\Controller就像preDispatch()會很棒。

我想避免這樣的:

class MyBaseController extends Controller { 
    public function __construct() { 
     // ... 
     // check: logged in? 
     // ... 
    } 
} 

class MyFooController extends MyBaseController() { 
    // ... 
} 

我剛剛找到的主題,從2011/2012。我是Symfony的新手,使用2.5版本,並想從頭開始瞭解最佳做法。任何建議?

在此先感謝!

編輯

有趣: http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html

回答

12

1 /你可以setup before (and also after) filters with the kernel.controller Event。 這是the documentation的一個很好的例子。

2 /還可以創建一個事件監聽器,其listens to the kernel.request even噸並檢查用戶是否指定任何控制器之前驗證。

這是HttpKernel調度的第一個事件,它主要用於向請求添加信息或在需要時返回早期響應(例如,拒絕未經身份驗證的用戶或無權訪問的用戶訪問任何給定的資源)。

您也可以在the kernel.controller event上創建一個偵聽器(正如前面列出的文檔中的示例中所述)。在HttpKernel確定控制器可調用之後調度此事件。它主要用於在執行控制器之前初始化事件,它也用於更改要執行的控制器

您必須閱讀the HttpKernel component documentation以瞭解Symfony內部行爲的全貌。

3 /也可以使用其限制於控制器訪問@Security annotation

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; 

class MyFooController extends Controller 
{ 
    /** 
    * @Security("has_role('ROLE_USER')") 
    */ 
    public function anyAction() 
    { 
     // ... 
+1

我已經創建了基於所述的Symfony食譜的束,其允許一個「過濾器之前」。 https://github.com/expertcoder/before-after-bundle 希望你覺得它有用,我邀請任何有建設性的批評。謝謝 – Sam 2016-05-25 23:39:57

相關問題