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