首页 文章

Symfony3登录并在FOSUserBundle上的一个模板中注册表单

提问于
浏览
2

我需要在登录表单和注册表单中放入同一页面 . 我正在使用Symfony 3.2和FOS User Bundle .

我发现了这个:How to merge login and register form in one template on FOSUserBundle

这是我的第一种方法,但存在问题 . 在验证错误时,页面被重定向到另一个路径(仅显示提交表单的模板) . 问题是SecurityController和RegistrationController不知道在twig中呈现两个fos控制器的控制器,它们只显示表单模板 . 使用这种方法,我无法覆盖fos控制器显示的模板以显示主模板,因为这将生成无限递归 .

我尝试重写fos控制器来重定向表单的验证错误,但重定向使得验证消息丢失 .

我也尝试将请求转发给fos SecurityController和RegistrationController(如:http://symfony.com/doc/current/controller/forwarding.html)但是对于登录的检查操作,我得到:RuntimeException 'You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.' . 它's already configured and was working, but forwarding the request directly to the controller seems to break it (i couldn' t弄清楚如何正确处理登录检查,因为check方法只返回运行时异常)

我能想到的最后一个解决方案是在新控制器中创建两个表单,但我不知道如何手动调用fos用户登录检查(对于注册我可以从RegistrationController复制所有registerAction) .

谢谢你的时间 .

1 回答

  • 0

    好的,我终于可以开始工作了 . 我创建了一个新的控制器,它使用fos控制器的输出呈现登录表单和注册表单 . 登录表单操作路由为login_check,注册表单操作路由与控制器的路由相同(frontend_login的值)

    The controller:

    /**
     * @Route("/ingresar", name="frontend_login")
     * @Method({"GET", "POST"}) 
     */
    public function loginAndRegisterAction(Request $request){
    
        $login_response = $this->forward('FOSUserBundle:Security:login', array( $request ));
        $register_response = $this->forward('FOSUserBundle:Registration:register', array( $request ));
    
        return $this->render('frontend/usuario/login_register.html.twig', array(
            'login' => $login_response->getContent(),
            'register' => $register_response->getContent(),
            ));
    }
    

    在显示内容的模板中,将其显示为原始状态(控制器将表单已将rendererd作为html返回到其内容中)

    {{ login|raw }}
    {{ register|raw }}
    

    我必须覆盖FosUserBundle模板大 beans ,不要扩展fosuserbundle布局 . Resources / FOSUserBundle / layout.html.twig:

    {% block fos_user_content %}{% endblock fos_user_content %}
    

    配置security.yml以指示登录路径是我们定义的控制器之一 . 出错时,它将显示frontend_login路由 .

    frontend:
            pattern: ^/
            context: website
            form_login:
                provider: fos_userbundle
                login_path: frontend_login
                check_path: login_check
    

    最后,覆盖显示表单的模板,以便注册表单的操作路由为frontend_login . 我这样做是因为我需要更改html结构,我认为将fos_user_registration_register路由更改为我们定义的路由应该可以解决问题 .

    {{ form_start(form, {'method': 'post', 'action': path('frontend_login'), 'attr': {'class': 'fos_user_registration_register', 'novalidate': 'novalidate'}}) }}
        {{ form_widget(form) }}
        <div>
            <input type="submit" value="Submit" />
        </div>
    {{ form_end(form) }}
    

相关问题