首页 文章

如何映射symfony2 's form collection field to a doctrine'的数组类型字段?

提问于
浏览
1

我有表格( AbstractType )映射到(学说持久的)实体 .

该实体有一个属于主义类型 array 的字段 .

根据symfony 's docs it should be possible to map a form collection field to a PHP' s 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 at line 47

如果不编写我自己的字段类型,甚至可以做我想做的事情吗?

更新:也许我应该重新解释我的问题:我怎么告诉symfony不要将这个字段映射到任何东西(如果我更改它的名称symfony抱怨实体没有这样的属性)?

2 回答

  • 0

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

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

    所以这是我的坏事 . 不管怎么说,还是要谢谢你 .

  • 2

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

相关问题