2013-07-26 38 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