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

标签 symfony event-listener

我需要在执行 Symfony 3 Controller 之前执行一些代码。

我阅读了本指南: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文档解释说,我们需要在我们需要的每个 Controller 上使用 implements TokenAuthenticatedController 来指定此 EventListener 会影响哪些 Controller ,但由于我想在 之前执行代码每个 Controller (所有),我希望存在一些方法来做到这一点,而无需在我的所有 Controller 上添加 implements

最佳答案

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

此外,您的 Controller 实际上不需要执行任何操作。 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!');
        }
    }

如果您不打算对监听器中的 Controller 执行任何操作并执行一些其他操作,您可以随心所欲地执行任何操作,前提是您的工作所需的一切都已注入(inject)监听器并在此时可用。

从文档编辑:

A kernel.controller listener gets notified on every request, right before the controller is executed. So, first, you need some way to identify if the controller that matches the request needs token validation.

如果你想执行你的代码,而不管最终执行哪个 Controller ,你不需要前面提到的方法来识别将执行哪个 Controller ,因此根本不需要接口(interface)。

关于symfony - 在 Symfony3 上的每个请求中在 Controller 之前执行一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42931770/

相关文章:

php - symfony 4 中没有服务 FOSJsRoutingBundle

php - 翻译在 Symfony2 中不起作用

php - 在 TWIG 中使用 PHP 函数?

php - 交响乐 : can't we have a hidden entity field?

java - 在 HashSet 迭代上动态创建 javafx 按钮。如何为每个按钮创建单独的actionEvent?

javascript - 我的 onload 监听器似乎无法正常工作

facebook - FOSFacebookBundle 不调用自定义提供程序

Android registerListener 和电池生命周期

java - 禁用一组 JButton 中特定 JButton 的 mouseEvent

java - 重置小部件的默认值,而不触发 Vaadin Flow 14 Web 应用程序中的值更改监听器