如何将symfony2的表单集合字段映射到doctrine的数组类型字段?

时间:2012-05-07 15:27:43

标签: php forms symfony doctrine

我的表格(AbstractType)映射到(主义持久的)实体。

该实体有一个属于教义类型array的字段。

根据symfony的文档,应该可以将表单集合字段映射到PHP的array,但显然当表单映射到实体时它不起作用。 Symfony希望该字段是一个关系,但它只是一个array

这不是实际代码,只是一个例子:

考虑这个(学说坚持的)实体:

class Article
{
   ...
    /**
     * @ORM\Column(type="array")
     */
    protected $tags;   
   ...
}

这个实体(不是由学说管理):

class Tag
{
   ...
    public $name;
   ...
}

此表单类型:

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('tags', 'collection', array('type' => new TagType()));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Article',
        );
    }
}

标签的表单类型:

class TagType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name', 'text');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Tag',
        );
    }
}

当试图实例化ArticleType原则时,会抱怨某些内容:

Expected argument of type "\Entity\Tag", "array" given

在档案中:

第47行

vendor / symfony / src / Symfony / Component / Form / Extension / Core / DataMapper / PropertyPathMapper.php

甚至可以在不编写我自己的字段类型的情况下做我想做的事情吗?

更新:也许我应该重新解释一下我的问题:我如何告诉symfony不要将此字段映射到任何内容(如果我更改其名称symfony抱怨实体没有这样的属性)?

2 个答案:

答案 0 :(得分:2)

我错过了一件事。我加载了fixtures,其中包含collection属性中的关联数组数组(此处为tags)。在将灯具更改为实体数组(此处为Tag个数组的数组)之后,我忘了重新加载灯具。

现在一切都运行得很完美,因此,无效的symfony可以将表单集合映射到array和关系(ArrayCollection)。区别在于 - 我不必手动保持关系的反面。

所以这是我的坏事。不管怎样,谢谢。

答案 1 :(得分:0)

因为array类型最终将转换为序列化字符串,将其映射到集合类型是不合适的。更好的方法应该是创建一个自定义字段类型,其中getParent是'text`并附加一个数据转换器,它将用户输入转换为数组,反之亦然。查看this食谱条目。