我有一个要求,应该为每个新会话向用户提供条款和条件。
我写了一个Listener
来监听GetResponseEvent
,并声明如下:
class: MyProject\CoreBundle\TermsAndConditionsDispatcherListener
arguments: ["@logger"]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
我基本上按照这个逻辑执行过程:
public function onKernelRequest(GetResponseEvent $event) {
if (!$event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
if ($request->getSession()->get("contractAccepted")) {
return;
}
if ($request->getPathInfo() == "/terms/accepted") {
$event->setResponse(new RedirectResponse($request->getSession()->get("firstRequestUrl")));
}
$request->getSession()->set("firstRequestUrl", $request->getUri());
$event->setResponse(new RedirectResponse("/terms"));
}
但正如您所看到的,它会执行两个重定向,第一个重定向用户将用户重定向到/terms
,第二个重定向到原始请求的网址时接受条款和条件。
有没有办法修改此过程以避免重定向?
我认为:在第一次请求时,我将原始Request
对象存储在会话中并构建另一个要处理的对象以显示术语,当用户确认条款和条件时,调用某个URL { {1}},此时原始请求将从sesssion加载并处理。
上述过程是否可行?我的代码怎么样?