我使用的是最新版本的FOSUserBundle和Symfony2 . 我必须提供一个可用于登录和注册的表格 . 它有两个领域:
-
邮件地址(必填)
-
密码(仅限登录时需要)
和两个按钮:
-
登录
-
注册
如果用户输入他的邮件地址并单击登录,他将收到密码丢失的错误 . 如果他输入他的邮件地址并点击注册,他会获得一个帐户并生成密码 . 我已经实现了整个功能,但我使用两个单独的表单进行登录和注册 .
现在我想合并这些表格 . 这是我到目前为止所尝试的:
public function welcomeAction()
{
$data = array();
$form = $this->createFormBuilder($data)
->add("email", "email")
->add("password", "password", array("required" => false))
->add("register", "submit")
->add("login", "submit")
->getForm();
$form->handleRequest($this->getRequest());
if ($form->isValid()) {
if ($form->get("login")->isClicked()) {
return $this->forward('FOSUserBundle:Security:check',
array('_username' => $form->getData()["email"],
'_password' => $form->getData()["password"]
)
);
} else if ($form->get("register")->isClicked()) {
echo "REG"; #testing
} else die("ERROR_WELCOME_FORM");
}
return $this->render('MyBundle:Index:welcome.html.twig', array("form" => $form->createView()));
}
我正在使用forward而不是重定向,因为重定向时无法传递POST参数 .
当我通过单击登录按钮提交表单时,我得到:
您必须使用安全防火墙配置中的form_login配置防火墙处理的检查路径 .
所以我更改了security.yml中的check_path参数
check_path:fos_user_security_check
至
check_path:welcome(这是我的索引路径:welcome()动作
并再次测试它 . 错误按预期消失,但我遇到两个新问题 .
首先,我无法再使用新的check_path单一登录表单 . 这是因为显然删除了原始的fos_user_security_check . 但我需要能够使用合并形式和单一形式 .
其次,我得到了错误
无效的CSRF令牌 .
有人有解决方案吗?这很容易在不侵入FOSUserBundle或手动执行登录操作的情况下实现吗?我需要相同的表单的寄存器部分,但我认为这是模拟的 .
这可能是错误的方法吗?我可以以某种方式使用相同的字段(电子邮件)两个分开的表单?