我的表格(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抱怨实体没有这样的属性)?
答案 0 :(得分:2)
我错过了一件事。我加载了fixtures,其中包含collection属性中的关联数组数组(此处为tags
)。在将灯具更改为实体数组(此处为Tag
个数组的数组)之后,我忘了重新加载灯具。
现在一切都运行得很完美,因此,无效的symfony可以将表单集合映射到array
和关系(ArrayCollection
)。区别在于 - 我不必手动保持关系的反面。
所以这是我的坏事。不管怎样,谢谢。
答案 1 :(得分:0)
因为array
类型最终将转换为序列化字符串,将其映射到集合类型是不合适的。更好的方法应该是创建一个自定义字段类型,其中getParent
是'text`并附加一个数据转换器,它将用户输入转换为数组,反之亦然。查看this食谱条目。