2017-05-31 40 views
2

我需要在登录表单和注册表单中放入同一页面。我正在使用Symfony 3.2和FOS User Bundle。Symfony3在FOSUserBundle上的一个模板中登录并注册表单

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

这是我第一次的做法,但有一个问题。在验证错误时,页面被重定向到另一条路线(仅显示提交表单的模板)。问题在于SecurityController和RegistrationController不知道哪个控制器会呈现树枝中的两个fos控制器,它们只是显示表单模板。通过这种方法,我无法重写fos控制器显示的模板来显示主模板,因为会产生无限递归。

我试着覆盖fos控制器对表单的验证错误进行重定向,但重定向会使验证消息丢失。

我也尝试将请求转发到两个FOS SecurityController和这个RegistrationController(是这样的:http://symfony.com/doc/current/controller/forwarding.html),但在登录的检查行动,我得到: 的RuntimeException“你必须配置支票路径通过使用防火墙来处理form_login在您的安全防火墙配置中。'。它已经被配置并正在工作,但直接将请求转发给控制器似乎打破了它(我无法弄清楚登录检查是如何进行的,因为检查方法只返回运行时异常)

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

谢谢你的时间。

回答

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布局。资源/ 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结构,我认为将路由更改为我们定义的路由应该是个诀窍。

{{ 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) }}