Symfony 2:如何在每个控制器动作之前触发代码?

时间:2014-10-28 20:12:04

标签: php symfony event-handling hook

我想检查,如果用户已登录 - 在 操作被调用之前。

preDispatch() Symfony\Bundle\FrameworkBundle\Controller\Controller这样的东西会很棒。

我想避免这个:

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

1 个答案:

答案 0 :(得分:14)

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

2 /您还可以创建一个listens to the kernel.request even t的事件监听器,并在定位任何控制器之前检查用户是否已通过身份验证。

它是由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()
    {
        // ...