Symfony3 上的每个请求中在 Controller 之前执行一些代码

Isa*_*sca 3 event-listener symfony

我需要在执行 Symfony 3 控制器之前执行一些代码。

我阅读了本指南:http://symfony.com/doc/current/event_dispatcher/before_after_filters.html解释了如何操作。

但在这一点上: http://symfony.com/doc/current/event_dispatcher/before_after_filters.html#tag-controllers-to-be-checked文档解释说,我们需要指定每个控制器将受到此EventListener影响的控制器implements TokenAuthenticatedController我们需要控制器,但由于我想在每个implements控制器(全部)之前执行代码,我希望存在某种方法来做到这一点,而无需在所有控制器上添加。

Joe*_*Joe 5

您真的需要在每个请求上执行代码吗?那么也许您应该查看可用的 KernelEvents(尤其是 kernel.request 和 kernel.controller)。去: http: //symfony.com/doc/current/components/http_kernel.html了解更多详细信息,例如主请求和子请求。

而且你的控制器实际上不需要实现任何东西。TokenAuthenticatedController仅在示例中实现执行:

if ($controller[0] instanceof TokenAuthenticatedController) {
        $token = $event->getRequest()->query->get('token');
        if (!in_array($token, $this->tokens)) {
            throw new AccessDeniedHttpException('This action needs a valid token!');
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您不打算对侦听器中的控制器执行任何操作并执行其他一些操作,那么您可以做任何您喜欢的事情,因为您完成工作所需的所有内容都已注入侦听器并在此时可用。

从文档编辑:

在执行控制器之前,kernel.controller 侦听器会收到每个请求的通知。因此,首先,您需要某种方法来识别与请求匹配的控制器是否需要令牌验证。

如果您想执行代码而不管最终执行哪个控制器,则不需要前面提到的方法来识别将执行哪个控制器,因此根本不需要接口。