2017-05-31 18 views
2

ログインフォームと登録フォームを同じページに入れる必要があります。私はSymfony 3.2とFOS User Bundleを使用しています。 FOSUserBundleの1つのテンプレートにsymfony3ログインと登録フォーム

は、私が見つかりましたこの:私の最初のアプローチはでしたが、問題がある

How to merge login and register form in one template on FOSUserBundle。検証エラーの場合、ページは別のルートにリダイレクトされます(送信されたフォームのテンプレートのみが表示されます)。問題は、SecurityControllerとRegistrationControllerが、両方のfosコントローラをtwigでレンダリングするコントローラを認識しておらず、フォームテンプレートだけを表示することです。このアプローチでは、メインテンプレートを表示するためにfosコントローラが表示しているテンプレートを上書きすることはできません。無限の再帰を生成するからです。

フォームの検証エラーでリダイレクトするためにfosコントローラをオーバーライドしようとしましたが、リダイレクトによって検証メッセージが失われてしまいました。

また、私は(このような:http://symfony.com/doc/current/controller/forwarding.html)の両方FOS SecurityControllerとRegistrationControllerに要求を転送しようとしましたが、ログインのチェック動作のために、私が手:あなたが使用してファイアウォールによって処理されるように、チェックのパスを設定する必要があります の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(), 
     )); 
} 

内容、生のそれを表示する(コントローラはフォームがすでにそれの内容にhtmlとしてrendererd戻る)

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

私はFosUserBundleを上書きする必要があるが、大豆をテンプレートインクルードは伸びていませんfosuserbundleのレイアウト。リソース/ FOSUserBundle/layout.html.twig:

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

は、ログインパスは、我々が定義されたコントローラの一つであることを示すためにsecurity.ymlファイルを設定します。エラーが発生した場合はfrontend_loginルートが表示されます。登録フォームの作用経路は、frontend_loginなるように

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

最後に、フォームを表示するテンプレートをオーバーライドします。私は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) }}