如何在 symfony2 中禁用某些路由的监听器?

Posted

技术标签:

【中文标题】如何在 symfony2 中禁用某些路由的监听器?【英文标题】:How to disable Listener for certain routes in symfony2? 【发布时间】:2016-04-23 15:12:47 【问题描述】:

在我们的 symfony2 应用程序中,有几个 Listener 的情况是,如果用户通过特定路线到达,他们应该什么都不做。

实现此目的的一种方法是检查 Uri,它非常难看。

protected function inThisCaseIgnore()

    return in_array(
        $this->requestStack->getCurrentRequest()->getRequestUri(),
        array(self::VERIFICATION_PATH, '/api/1/', self::WEBSERVICE_PATH)
    );

有没有更优雅的解决方案来实现这一点?我在想也许注释? 如果是怎么办?

【问题讨论】:

你听什么活动? onKernelRequest(GetResponseEvent $event) 【参考方案1】:

一种方法是在定义中标记要忽略的路由。比如:

cerad_game__project__game_report__update:
  pattern:  /project/_project/game-report/_game/update
  defaults:
    _ignore: true
    _model:      cerad_game__project__game_report__update__model_factory
    _form:       cerad_game__project__game_report__update__form_factory
    _controller: cerad_game__project__game_report__update__controller:action
    _template: '@CeradGame/Project/GameReport/Update/GameReportUpdateTwigPage.html.twig'

一个简单的 $request->has('_ignore') 就可以了。

【讨论】:

那会是 routing.yml 吗?或者那会去哪里? 无论您在哪里定义路线:symfony.com/doc/current/book/routing.html 我们将路由信息作为控制器中的注释。你知道那里的正确格式是什么吗? 也许默认部分可能会有所帮助? symfony.com/doc/current/book/…【参考方案2】:

您可以注册自己的事件侦听器,该侦听器的优先级高于应选择跳过的每个侦听器。在此侦听器中,您可以执行您需要进行的任何测试,以检测是否应该跳过其他侦听器。如果是这种情况,只需调用您通过的Event 实例的stopPropagation() 方法。

但是你需要小心你使用哪个优先级来注册你的监听器,因为 Symfony 本身通过事件监听器执行很多事情,跳过它们可能会导致意外的行为。但是,您可以看到list of registered core event listeners in the documentation。

【讨论】:

这并不能真正解决我的问题。我的问题在于“执行任何测试”。无论我在哪个 Listener 中执行,这都是一样的。 所以你真的想根据路由名称跳过侦听器? 或者基于控制器的方法。 可以通过请求的属性参数包(使用$request->attributes->get('_controller')$request->attributes->get('_route'))访问控制器和路由信息。

以上是关于如何在 symfony2 中禁用某些路由的监听器?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以禁用 symfony 2 中某些控制器的会话?

如何禁用 Express 4 应用程序中某些路由的缓存?

Symfony2:使用侦听器更改渲染视图

Symfony2 语言环境整页事件监听器

为某些路由禁用 vue-router?或者如何运行 SPA 后端和非 SPA 前端?

如何在 Symfony2 中获取控制器的所有路由列表?