【问题标题】:How to disable Listener for certain routes in symfony2?如何在 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)

标签: symfony listener


【解决方案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') 就可以了。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 这并不能真正解决我的问题。我的问题在于“执行任何测试”。无论我在哪个 Listener 中执行,这都是一样的。
  • 所以你真的想根据路由名称跳过侦听器?
  • 或者基于控制器的方法。
  • 可以通过请求的属性参数包(使用$request->attributes->get('_controller')$request->attributes->get('_route'))访问控制器和路由信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2011-12-31
相关资源
最近更新 更多