我需要在登录表单和注册表单中放入相同的页面。我正在使用Symfony 3.2和FOS用户包。
我发现了这个: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'您必须使用安全防火墙配置中的form_login配置防火墙处理的检查路径。'。它已经配置并且正在工作,但是直接将请求转发给控制器似乎打破了它(我无法弄清楚登录检查是如何进行的,因为check方法只返回运行时异常)
我能想到的最后一个解决方案是在新控制器中创建两个表单,但我不知道如何手动调用fos用户登录检查(对于注册我可以从RegistrationController复制所有registerAction) )。
感谢您的时间。
答案 0 :(得分:0)
好的,我终于可以开始工作了。我创建了一个新的控制器,它使用fos控制器的输出呈现登录表单和注册表单。登录表单操作路由为login_check,注册表单操作路由与控制器的路由相同(frontend_login的值)
控制器:
/**
* @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模板大豆,不要扩展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) }}