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

时间:2017-03-21 15:42:05

标签: symfony event-listener

我需要在执行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会影响哪些控制器,但是因为我想在每个之前执行代码/ em> controller(全部),我希望在没有在我的所有控制器上添加implements的情况下存在一些方法。

2 个答案:

答案 0 :(得分:4)

您真的需要在每个请求上执行代码吗?那么也许您应该查看可用的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!');
        }
    }

如果你不打算在听众中对控制器做任何事情并做一些其他的事情,你可以做任何你喜欢的事情,因为你需要做的一切都是你的工作被注入到听众中并且在那里可用点。

从文档编辑:

  

在执行控制器之前,每次请求都会收到kernel.controller监听器的通知。因此,首先,您需要一些方法来确定与请求匹配的控制器是否需要令牌验证。

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

答案 1 :(得分:2)

在文档中显示的示例中,routes.MapRoute( name: "test", url: "randomstring/{action}",//this works defaults: new { controller = "WorkRoles", action = "DisplayListOfRolesUser", id = UrlParameter.Optional } ); 仅用于在实现该接口的所有控制器上执行特定代码,以防止在所有控制器中的每个请求上执行。

请记住,您可能需要检查是否确实要在每个请求类型中执行代码,或者只检查预定义类型,例如Events and Event Listeners中所述的请求。