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


How to map symfony2's form collection field to a doctrine's array type field?

我有映射到(教义持久(实体的形式(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

在文件中:

vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php在第47行

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

更新:也许我应该改写我的问题:我如何告诉symfony不要将此字段映射到任何东西(如果我更改其名称symfony抱怨该实体没有这样的属性(?

我错过了一件事。我加载了夹具,其中包含集合属性中的关联数组数组(tags此处(。将夹具更改为实体数组(此处为Tag实例数组(后,我忘记重新加载夹具。

现在一切都完美无缺,所以我需要symfony可以将表单集合映射到array和关系(ArrayCollection(。不同之处在于 - 我不必手动保留关系的反面。

所以这是我的错。无论如何,谢谢。

由于array类型最终将转换为序列化字符串,因此将其映射到集合类型是不合适的。 更好的方法应该是创建一个自定义字段类型,其中getParent是"文本"并附加一个数据转换器,该转换器会将用户输入转换为数组,反之亦然。检查此说明书条目。