forms - Symfony2 : Form's view data issue

标签 forms symfony

大家好,我对 Symfony2 FormBuilder 有一些问题,实际上,我有一个实体用户(OneByOne)链接到一个实体地址,这似乎很简单,但是当我尝试将 AddressType 表单嵌入到UserType One 我正面临这个异常:

The form's view data is expected to be an instance of class Acme\Bundle\AddressBundle\Entity\Adresse, but is an instance of class Doctrine\Common\Collections\ArrayCollection. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms an instance of class Doctrine\Common\Collections\ArrayCollection to an instance of 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'
        ));
    }

预先感谢您的帮助!

最佳答案

一个问题是您将地址设为公共(public)属性(property)。在 Doctrine 2 中,您需要将您的属性设为私有(private)或 protected 。 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 用户基类,因为它的构造函数没有被调用。

我建议您将表单类型减少到最小的用户/地址并让事情正常工作。然后加入你的别墅和所有其他的东西。实际上,只需从创建一个简单的用户开始,然后添加地址即可。

您没有展示如何创建用户对象,但请记住,在表单启动之前确保地址对象存在由您决定。教义不会为你创造它。

关于forms - Symfony2 : Form's view data issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871292/

相关文章:

javascript - 设置哈希后无法聚焦输入

php - Doctrine - 查询相关实体的条件

symfony - 在教义中连接三个或更多领域

php - Twig - 确定是否移动代理

javascript - 在 jquery 验证期间向非输入元素添加样式

forms - bootstrap-tags输入表单,按回车键提交

javascript - 在表单上表达 JS 提交停留在页面上

html - Twig 循环分组 div

arrays - Twig 检查值是否在数组中

php - 使用 Php 和 MySQL 删除一行