大家好我在Symfony2 FormBuilder上遇到了一些问题,实际上,我有一个实体用户链接(OneByOne)到一个实体Adress,它似乎很简单,但是当我试图嵌入AddressType时形成UserType One我正面临这个例外:
表单的视图数据应该是Acme \ Bundle \ AddressBundle \ Entity \ Adresse类的实例,但是是Doctrine \ Common \ Collections \ ArrayCollection类的实例。您可以通过将“data_class”选项设置为null或通过添加将Doctrine \ Common \ Collections \ ArrayCollection类的实例转换为Acme \ Bundle \ AddressBundle \ Entity \ Adresse
的实例的视图转换器来避免此错误
我在这里放了一些代码(简化为可读)以使我的问题更加明白:
我的用户类(扩展了FosUserBundle):
class User extends BaseUser
{
...
/**
* @ORM\OneToOne(targetEntity="Acme\bundle\AddressBundle\Entity\Address", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
* @Assert\Valid
*/
public $address;
.......
}
链接的表单类型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 :(得分:1)
一个问题是您将地址设为公共财产。在Doctrine 2中,您需要将属性设置为私有或受保护。 D2依赖于此来实现延迟加载。基本上,你的地址永远不会被加载,但为什么你得到一个数组有点谜题。您是否正在将地址初始化为构造函数中的数组?可能是复制/粘贴错误?
你应该:
class User extends BaseUser
{
protected $address;
public function getAddress() { return $this->address; }
您还需要确保UserObject始终具有Address对象,否则表单将会抱怨。
=============================================== =========
看着你的pastebin,我看到了:
class User extends BaseUser
{
public function __construct()
{
$this->adresse = new \Doctrine\Common\Collections\ArrayCollection();
}
这不仅解释了不需要的数组,而且还会搞乱fos用户基类,因为它的构造函数没有被调用。
我建议您将表单类型删除到最小用户/地址并使其正常工作。然后添加你的villia和所有其他东西。实际上,只需从创建一个简单的用户开始,然后添加地址。
您没有展示如何创建用户对象,但请记住,您需要确保在表单启动之前存在地址对象。学说不会为你创造它。
答案 1 :(得分: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'
));