2011-11-12 6 views
24

でのサービスがされている形態を作成します。ここで私が設定している方法です私は任意のコントローラから行うことができるようにしたいのですがどのようなSymfony2の

$register = $this->get('register_manager'); 
return $this->render(
    'AcmeUserBundle:Account:register.html.twig', 
    array(
     'form' => $register->getRegistrationForm(), 
     ) 
); 

そして、私のテンプレートで

<form> 
    {{ form_widget(form) }} 
</form> 

私は

parameters: 
    register_manager.class: Acme\UserBundle\Manager\RegisterManager 

services: 
    register_manager: 
     class:  %register_manager.class% 
     arguments: [@form.factory] 
持っている私のAcme/UserBundle/Resources/config/services.ymlで、これまでにアップ

namespace Acme\UserBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('username','text'); 
     $builder->add('email','email'); 
     $builder->add('password','password'); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Acme\UserBundle\Entity\User', 
     ); 
    } 

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

私は、コントローラでそれを持っていたとしてRegistrationType()作品を知っている:私は

namespace Acme\UserBundle\Manager; 

use Acme\UserBundle\Form\Type\RegistrationType; 
use Symfony\Component\Form\FormFactoryInterface; 

class RegisterManager 
{ 

    protected $formFactory; 

    public function __construct(FormFactoryInterface $formFactory) 
    { 
     $this->formFactory = $formFactory; 
    } 


    public function getRegistrationForm() 
    { 
     return $this->formFactory->createBuilder(new RegistrationType()); 
    } 
} 

を持ってAcme\UserBundle\Form\Type\RegistrationTypeに私が持っているRegisterManager.php

私の問題は、サービスとしてRegisterManagerを設定することです。私はそこに適切なコンポーネントを手に入れることができず、どこから見えるのか分かりません。

+0

遭遇する問題はなんですか? 「そこに適切なコンポーネントを手に入れることができない」とはどういう意味ですか?今は期待どおりに動作するはずです。 – gilden

+0

今、私のRegistrationManagerサービスでは、 '' 'createForm(new RegistrationType())' ''を呼び出し、それをコントローラに渡すことができるようにする必要がありますが、 '' 'createForm()' ''が定義されており、このサービスクラスで利用できるようにする方法です。 Symfony Formsのドキュメントでは、 '' $ this-> createForm() '' 'のようにアクセスしますが、私は自分のサービスクラスでどのようにしますか?私はそれが '' 'FormFactoryInterface'''の一部ではないと思います。http://symfony.com/doc/current/book/forms.html#creating-form-classes – ed209

+0

FOSUserBundleはform.factoryサービスを直接使用します。 RegisterManagerクラスの必要性を確認してください。https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/profile.xml – solarc

答えて

19

あなたはほぼそこにいるようです。あなたのサービスからフォームオブジェクトを取得するには、コントローラで、なぜ$this->createForm()作品FormFactoryInterface::createBuilder()

理由の代わりにFormFactoryInterface::create()を使用する必要があり、すべてのコントローラは、このメソッドを実装するためにたまたま、base controllerを拡張しているためです。

私のIDEが特定のSymfonyファイルにリンクする能力があることが判明しました。すでに使用していない場合は、使用することをお勧めします。また、hereというgitリポジトリもあります。