如何在 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 中禁用某些路由的监听器?的主要内容,如果未能解决你的问题,请参考以下文章