Symfony 2:如何在每次控制器操作之前激发代码


Symfony 2: how to fire code before EVERY controller-action?

我想检查一下,在调用操作之前,用户是否已登录。

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/您可以使用kernel.controller事件在过滤器之前(以及之后)进行设置。下面是文档中的一个很好的例子。

  • 使用kernel.controller事件进行筛选之前

2/您还可以创建一个侦听kernel.request事件的事件侦听器,并在针对任何控制器之前检查用户是否已通过身份验证。

这是HttpKernel调度的第一个事件,主要用于向请求添加信息或在需要时返回早期响应(例如,拒绝未经身份验证的用户或无权访问任何给定资源的用户的访问)。

您还可以在kernel.controller事件上创建一个侦听器(如我前面列出的文档中的示例所述)。此事件是在HttpKernel确定控制器可调用后发出的。它主要用于在控制器执行之前初始化,也用于更改控制器以执行

您必须阅读HttpKernel组件文档,才能全面了解Symfony在内部的行为。

3/您也可以使用@Security注释来限制对控制器、的访问

use Sensio'Bundle'FrameworkExtraBundle'Configuration'Security;
class MyFooController extends Controller
{
    /**
     * @Security("has_role('ROLE_USER')")
     */
    public function anyAction()
    {
        // ...