symfony2:如何在任何其他侦听器之前创建一个被调用的侦听器?

时间:2014-07-07 01:33:08

标签: symfony oauth listener http-redirect

我希望在调用任何侦听器之前执行重定向。

特别是在hwi的oauthListener开始之前。

我想这样做的原因:

  • 我正在我的symfony plateform / app
  • 上实现oauth
  • 我的应用管理多个博客' (wordpress multisite style)
  • 我希望oauth(脸书,谷歌......)使用单个应用程序而不必每次新的博客时都设置一个应用程序。已创建
  • 出现的问题:
    • 重定向网址必须是唯一的(即使谷歌你可以设置多个,我也不想)
    • 我的博客有时会有别名=>并不总是在同一个域中浏览
    • 搞砸了我的会话,因为它们无法在多个域之间共享(sub yes,domains no)
  • 到目前为止解决方案:
    • 在我的oauth请求中,我为redirect_uri
    • 传递了一个通用域名
    • 我使用状态查询参数来存储源自
    • 的域
  • 我想要的:
    • 我希望有一个监听器内核或其他所有内容,以检查我是否有此状态查询参数集
    • 我希望它能够触发当前请求立即重定向到存储在"状态"中的原始域。 PARAM。

我完全错了吗? 如果我想继续,你知道我应该如何声明我的听众,以便它首先出现并且能够触发立即重定向吗?

2 个答案:

答案 0 :(得分:1)

kernel.request事件是第一个被调度的事件。

查看 KernelEvents 列表。

要让您的特定侦听器在其他kernel.request侦听器之前执行,您可以将priority选项(范围:-255到255,最高执行率)添加到侦听器的服务配置中。

示例

services:
    kernel.listener.your_listener_name:
        class: Acme\DemoBundle\EventListener\AcmeRequestListener
        tags:
            - name: kernel.event_listener
              event: kernel.request
              method: onKernelRequest
              priority: 255

现在剩下的就是在侦听器的onKernelRequest()方法中的某些条件下执行重定向。

我相信你会弄清楚如何做到这一点。完整的代码示例将超出此问题的范围。

有关如何编写内核事件侦听器的更多说明,请参阅文档章节:

<强> "How to create an Event Listener"

答案 1 :(得分:0)

确实就是这样。

我尝试了几次,并认为它不起作用,但这可能是缓存清除的问题。

那么,对于那些想知道的人: 我处理我的数据以创建RedirectResponse(Symfony \ Component \ HttpFoundation \ RedirectResponse)

在onKernelRequest中我做

public function onKernelRequest(GetResponseEvent $event){
    /**
      ... do stuff here
    */

    $event->setResponse($myResponse);
}