2013-07-26 8 views
6

こんにちはすべてI'amはSymfony2のFormBuilderといくつかの問題を持つが、実際に、私は実体住所へ(OneByOne)にリンクされているエンティティのユーザーを持って、本当に簡単なことのようですが、私は「ときUserType一つにAddressTypeにフォームを埋め込むしようとしているメートル私はこの例外に直面している:Symfony2の:フォームのビューのデータの問題

フォームのビューデータがクラスアクメ\バンドル\ AddressBundle \エンティティ\住所のインスタンスであることが予想、しかしインスタンスですクラス教義\共通\コレクション\のArrayCollectionの。 "data_class"オプションをnullに設定するか、Doctrine \ Common \ Collections \ ArrayCollectionクラスのインスタンスをAcme \ Bundle \ AddressBundle \ Entity \ Adresseのインスタンスに変換するビュートランスフォーマーを追加することで、このエラーを回避できます

私はここに私の問題は、より多くのunderstableにする(読み出しを可能にするに減少)いくつかのコード入れ:(FosUserBundleの1の拡張)を

マイUserクラス:

class User extends BaseUser 
{ 
    ... 

    /** 
    * @ORM\OneToOne(targetEntity="Acme\bundle\AddressBundle\Entity\Address", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(nullable=true) 
    * @Assert\Valid 
    */ 
    public $address; 

    ....... 

} 

リンケをDフォームタイプbuildForm機能:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     // add your custom field 
     $builder->add('name','text') 
       ->add('address',new AddressType(),array(

          'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 

        ) 
       ); 


    } 

マイアドレスフォームタイプ:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('city','text') 
       ->add('title','text'); 
    } 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 
     )); 
    } 

はあなたの助けのために事前にありがとうございます!

+0

エラーメッセージに示唆されたことを試しましたか? – cheesemacfly

+0

はい、私はそれを試しましたが、私はこのメッセージを持っています。spl_object_hash()は、パラメータ1がオブジェクトであることを期待しています。 –

答えて

1

一つの問題は、あなたがアドレス公共財産を作ったということです。 Doctrine 2では、プロパティをprivateまたはprotectedのいずれかにする必要があります。 D2はこれを利用して遅延ロードを実装しています。あなたは、配列を得ている理由は謎のビットがあるものの、基本的に、あなたのアドレスがロードされていないばかりありません。アドレスをコンストラクタ内の配列に初期化していますか?たぶん、コピー/ペーストエラーですか?

あなたが持っている必要があります。

class User extends BaseUser 
{ 
    protected $address; 

    public function getAddress() { return $this->address; } 

ます。また、ユーザーオブジェクトは、常にAddressオブジェクトを持っているか、フォームが文句を言うだろうことを確認する必要があります。

============================================== ==========

あなたペーストビンを見て、私は次を参照してください。

不要な配列を説明するだけでなく、それのコンストラクタ以来台無しFOSユーザーベースクラスがあるだけでなく
class User extends BaseUser 
{ 
public function __construct() 
{ 
    $this->adresse = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

呼び出されません。

私はあなただけで最低限のユーザー/アドレスまでごフォームタイプを除去し、作業の事を得ることを示唆しています。そして、あなたの絨毯と他のすべてのものを加えてください。実際には、単純なユーザーの作成を開始し、アドレスに追加します。

ユーザーオブジェクトの作成方法は示していませんが、フォームが始動する前にアドレスオブジェクトが存在することを確認することはあなた次第です。 Doctrineはそれを作成しません。

+1

こんにちはCerad、ありがとう、私はpublicからprotectedに変更を加えました。私はコンストラクタ内の配列であるためにアドレスを初期化していません。ユーザーは常にAddressオブジェクトを –

+0

にリンクしています... Entity \ Adresse ...あなたのエンティティはAddressと呼ばれます。ペーストの問題をコピーしますか?フォームにUserエンティティを渡してもよろしいですか?あなたのシステムには2つのバージョンのユーザーがいるようです。 – Cerad

+0

Cerad、それはコピーの貼り付けの問題です。アドレスをアドレスとみなし、私はFOSUserBundleとそのRegistrationFormTypeを使用しています。使用するエンティティはFOSUSerBundle(Acme/Bundle/UserBundle/User)です。 –

0

住所はエンティティであるため、フィールドタイプがエンティティから読み込まれたことをフォームに知らせる必要があります。ここを参照してください:このようなhttp://symfony.com/doc/2.2/reference/forms/types/entity.html

てみてください何か:

$builder->add('name', 'text') 
     ->add('address', 'entity',array(
       'class' => 'AddressBundle:Address', 
       'property' => 'address' 
)); 
+2

既存のエンティティのリストから選択する必要がある場合、エンティティタイプが使用されます。 opが何をしようとしているのかは正確には分かりません。 – Cerad

関連する問題