2014-10-28 78 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

相关问题