2016-11-04 3 views
2

私はアプリにログイン/登録フォームを持っています。すべてのビューでsymfonyのアクセスフォーム

namespace UserBundle\Form; 

use Symfony\Component\Form\AbstractType; 

class RegisterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('username', 'text', ['label' => 'Username']); 
     $builder->add('email', 'hidden', ['label' => 'Email']); 
     $builder->add('password', 'password',['label' => 'Password']); 

     $builder->add('cancel', SubmitType::class, [ 
      'label' => 'CANCEL' 
     ]); 

     $builder->add('register', SubmitType::class, [ 
      'label' => 'CREATE ACCOUNT' 
     ]); 
    } 

    public function getName() 
    { 
     return 'register'; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'UserBundle\Entity\User', 
     ]); 
    } 
} 

私はので、私は私の質問はsymfonyはそれを行う方法を推奨されているもの、であるフォームのマークアップはbase.html.twig

に置くことにしたいすべてのページでは、これが利用可能たいですか?私は、コントローラーのすべてのアクションでフォームを渡し続けたくありません。

どうすればよいですか?サービスを定義することによって?任意の例またはポインタが評価されます。

ありがとうございました。

答えて

3

を参照してください。
このコントローラアクションをtwigから直接呼び出すことができます。コントローラの呼び出しをメインのlayout.html.twigに追加します。

など。

{% render controller('AppBundle:Login:form') %} 

コントローラのようなものです。

class LoginController extends Controller 
{ 
    public function form(Request $request) 
    { 
    // create your form 

    // return html of form 
    } 
} 

参考:How to load a controller function and render it in a twig tag using Symfony2? - @Blowski

で答えを見て登録例。

<?php 
namespace AppBundle\Controller\Security; 

use AppBundle\Entity\User, 
    AppBundle\Form\Entity\UserType; 
use \Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller, 
    Symfony\Component\HttpFoundation\Request; 

class RegistrationController extends Controller 
{ 
    /** 
    * @Route("/register", name="user_registration") 
    */ 
    public function registerAction(Request $request) 
    { 
     // 1) build the form 
     $user = new User(); 
     $form = $this->createForm(UserType::class, $user); 

     // 2) handle the submit (will only happen on POST) 
     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 

      // 3) Encode the password (you could also do this via Doctrine listener) 
      $password = $this->get('security.password_encoder') 
       ->encodePassword($user, $user->getPlainPassword()); 
      $user->setPassword($password); 

      // 4) save the User! 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($user); 
      $em->flush(); 

      // ... do any other work - like sending them an email, etc 
      // maybe set a "flash" success message for the user 

      return $this->redirectToRoute('replace_with_some_route'); 
     } 

     return $this->render(
      'AppBundle:security:register.html.twig', 
      array('form' => $form->createView()) 
     ); 
    } 
} 
+0

私はこれも登録したいと思うと仮定します。登録のロジックはどこで処理しますか? –

+0

私はcontorlerを作成します。例えば、ユーザー登録を処理する関数を持つRegistrationControllerです。次に、twigコントローラ機能を使用して、必要なアクションを呼び出すことができます。回答を – Rooneyl

+0

に更新していただきありがとうございます、私はそれがAjax形式であることを忘れていました。私は今どのように行くのか手がかりを持っています。 :-) –

2

FormViewのインスタンスをRegisterTypeから渡すことを意味しますか?

私は最も簡単に、FormBuilderを依存関係として登録し、フォームビューで関数(または多分グローバル変数)を公開するTwig拡張を作成できると思います。また、フォームビューのインスタンスを1つだけ使用し、必要に応じて複数回使用することもできます。

は、私は、フォームを処理dedictaed contollerを持っているでしょうhttp://symfony.com/doc/current/templating/twig_extension.html

関連する問題