【发布时间】:2016-10-20 06:14:20
【问题描述】:
在我的 Symfony 3.0.6 应用程序中,某些常用路由在用户注册完成之前不可用。在这完成之前,我使用AccessDeniedHandlerInterface 将他们重定向到提示他们完成它的路线。我还用一条消息来解释发生了什么:
/**
* Handles an access denied failure.
*
* @param Request $request
* @param AccessDeniedException $accessDeniedException
*
* @return Response may return null
*/
public function handle(Request $request, AccessDeniedException $accessDeniedException)
{
if (null === $token = $this->security->getToken()) {
return;
}
if (!is_object($user = $token->getUser())) {
return;
}
/** @var User $user */
if (!$user->isFinalised()) {
$request->getSession()->getFlashBag()->add('info', 'You need to complete your registration before you can do this!');
return new RedirectResponse($this->router->generate('app_registration_complete'));
}
return;
}
但是,Chrome 的预取/预渲染服务会出现问题 - 如果 Chrome 确定某个 URL 可能会被访问,它会预取它。预取会导致上面的 flash 消息被添加到用户的会话中,因此 any 后续页面加载意味着会显示该消息。如果他们确实去了他们还不允许访问的路线,他们会看到两次消息 - 一次在预取期间生成,另一次在他们实际导航时生成。
this question 中描述了类似的问题,但在这种情况下,接受的答案(使用POST 进行注销请求)似乎并不是正确的解决方案。 flash 消息更多的是对GET 重定向的解释性补充,而不是改变应用程序状态的东西。此外,用户可能会通过多种方式到达这些不允许的路线之一,我将所有这些都转换为触发POST 以解决某些情况下的预取问题对我来说没有意义。
那么……我应该如何处理呢?
【问题讨论】:
标签: php google-chrome symfony