2013-07-26 47 views
6

大家好我有Symfony2 FormBuilder的一些問題,實際上,我有一個實體用戶鏈接(OneByOne)實體地址,它似乎很簡單,但當我'米試圖將地址類型表嵌入到用戶類型一:我面臨着這樣的例外:Symfony2:窗體的視圖數據問題

表單的視圖數據有望成爲一流的Acme \包\ AddressBundle \實體\住址的實例,但一個實例類Doctrine \ Common \ Collections \ ArrayCollection。您可以通過將「data_class」選項設置爲null或添加將Doctrine \ Common \ Collections \ ArrayCollection類的實例轉換爲Acme \ Bundle \ AddressBundle \ Entity \ Adresse實例的視圖轉換器來避免此錯誤

我把這裏的一些代碼(減少是可讀的),使我的問題更加understable:

我的用戶類(擴展了FosUserBundle一個人):

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

一個問題是,你做地址的公共財產。在學說2中,你需要使你的財產不受保護或私有。 D2依靠這個來實現延遲加載。基本上,你的地址永遠不會被加載,雖然你爲什麼要獲得一個數組是一個難題。你是否將地址初始化爲構造函數中的數組?也許是複製/粘貼錯誤?

你應該有:

class User extends BaseUser 
{ 
    protected $address; 

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

你還需要確保UserObject始終有一個地址對象或形式會抱怨。

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

看你的引擎收錄,我看到:

class User extends BaseUser 
{ 
public function __construct() 
{ 
    $this->adresse = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

這不僅解釋了不必要的數組,但也會弄亂FOS用戶羣類,因爲它的構造是不叫。

我建議你將你的表單類型下拉到最小的用戶/地址並使其工作。然後添加你的絨毛和所有其他的東西。事實上,從創建一個簡單的用戶開始,然後添加地址。

您沒有展示如何創建用戶對象,但請記住,確保在表單啓動之前存在地址對象取決於您。學說不會爲你創造它。

+1

嗨Cerad,謝謝,我做了公共更改保護,我沒有初始化地址是在構造函數中的數組,並且用戶始終有一個地址對象與 –

+0

鏈接您的錯誤消息有... Entity \ Adresse ...但您的實體稱爲地址。複製粘貼問題?你確定你將一個用戶實體傳遞給表單嗎?這幾乎就像你的系統上有兩個版本的用戶。 – Cerad

+0

Cerad,它是一個複製粘貼問題,考慮adresse作爲地址,我正在使用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

當需要從現有實體列表中選擇時使用實體類型。並不完全是該做什麼。 – Cerad