我使用的是最新版本的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或手动执行登录操作的情况下实现吗?我需要相同的表单的寄存器部分,但我认为这是模拟的 .

这可能是错误的方法吗?我可以以某种方式使用相同的字段(电子邮件)两个分开的表单?