2017-05-31 39 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) }}