【问题标题】:symfony2: How to create a listener that's being invoked before any other listener?symfony2:如何创建一个在任何其他侦听器之前被调用的侦听器?
【发布时间】:2014-08-27 10:12:02
【问题描述】:
我想在调用任何侦听器之前执行重定向。
特别是在 hwi 的 oauthListener 启动之前。
我想这样做的原因:
- 我正在我的 symfony 平台/应用程序上实施 oauth
- 我的应用管理多个“博客”(wordpress 多站点样式)
- 我希望 oauth(facebook、google...)使用单个应用程序,而不必在每次创建新的“博客”时都设置一个应用程序
- 出现的问题:
- 重定向 url 必须是唯一的(即使对于谷歌你可以设置多个,我不想这样做)
- 我的博客有时有别名 => 并不总是通过同一个域浏览
- 搞砸了我的会话,因为它们不能在多个域之间共享(子是,域否)
- 到目前为止我已经实施的解决方案:
- 在我的 oauth 请求中,我为 redirect_uri 传递了一个通用域
- 我正在使用状态查询参数来存储我来自的域
- 我想要什么:
- 我希望有一个侦听器内核或其他先于其他所有内容来检查我是否设置了此状态查询参数
- 我希望它触发将当前请求立即重定向到存储在“状态”参数中的源域。
我做错了吗?
如果我想继续,你知道我应该如何声明我的侦听器以便它首先出现并且能够触发立即重定向吗?
【问题讨论】:
标签:
symfony
oauth
listener
http-redirect
【解决方案1】:
确实是这样。
我试了几次,觉得不行,应该是缓存清除的问题。
那么,对于那些想知道的人:
我处理我的数据以创建 RedirectResponse (Symfony\Component\HttpFoundation\RedirectResponse)
在 onKernelRequest 中我会这样做
public function onKernelRequest(GetResponseEvent $event){
/**
... do stuff here
*/
$event->setResponse($myResponse);
}
【解决方案2】:
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"