我有很多表单是用户在一页上填写的,但在用户发帖后,控制器会检查表单是否有效,如果用户已经登录,则保存信息。
需要帮助
若用户并没有登录,那个么将他重定向到他注册的注册页面,注册后他将自动登录,然后它应该返回到具有发布值的同一控制器,以便保存。
$form->isValid && !$this->getUser()
然后将用户重定向到会话中保存了此表单值的注册页面- 用户注册或登录后,返回上一个控制器(无需任何进一步操作),它应该自动保存以前提交的表单。因为它是
$form->isValid()
我很困惑,我应该在会话中保存表单值并重定向吗?它能正确地保存模型值吗?
此外,我应该如何将用户重定向到注册页面,同时告诉Symfony在登录后使用post方法返回到同一页面。
我认为您必须遵循以下结构:
案例:提交表单后,页面重定向到注册/登录页面。
1.)填写表单并在提交表单后将post数据转换为serialize数组。在这里
2.)在隐藏字段或会话中粘贴序列化数组(注册/登录页面)。
3.)填写注册表格,注册后,发送回上一个表格页面,并将隐藏数据发送到该页面并取消序列化。此处
建议:如果您希望您的帖子数据不显示在页面中,那么您可以使用urlencode和urldecode函数或您可以使用的任何其他编码方法。
注意:使用会话或cookie将帖子数据从一个页面发送到另一个页面是不好的做法。它将出现在所有页面上,直到您取消设置/删除它。
手动从控制器重定向到登录页面,使用以下内容:
$session->set('_security.user_firewall.target_path', $request->getUri());
throw new AuthenticationException(); // use Symfony'Component'Security'Core'Exception'AuthenticationException;
从注册页面重定向,使用以下内容:
$key = '_security.user_firewall.target_path'; #where "user_firewall" is your firewall name
//check if the referrer session key has been set
if ($this->container->get('session')->has($key))
{
//set the url based on the link they were trying to access before being authenticated
$url = $this->container->get('session')->get($key);
//remove the session key
$this->container->get('session')->remove($key);
}
// if the referrer key was never set, redirect to a default route
else{
$url = $this->generateUrl($routeName);
}
return new RedirectResponse($url);
对我来说,最简单的解决方案是将两个页面作为div放在同一页面上,并使用javascript隐藏未提交的表单,这样就不需要存储和重新填充值。