我正在尝试为多个实体构建一个表单。我先介绍一些示例类:
为清楚起见,我没有显示所有注释或对其进行缩写,也没有显示使用或命名空间命令。
/**
* The Entity class
* @ORM ... mapping to ORM
*/
class EntityA {
/**
* @var ModelArray
* @ORM\Column(name="...", type="object")
*/
private $modelArray;
// Getters and Setters, default constructor
}
/**
* An array Wrapper, keeping the array always unique, sorting it by criteria etc.
* @ORM(...)
*/
class ModelArray {
/**
* @var array<A>
*/
private $array;
// Getter, Adder, Remover, Constructor, other private logic
}
请特别注意 ModelArray 类仅存储给定类型 A 的对象:
/**
* One more Model
*/
class A {
/**
* @var boolean
*/
private $bool;
/**
* @var string
*/
private $string;
// Getters, Setters
}
我选择了这种数据结构,因为我永远不需要 A 的对象存在于 EntityA 类之外,并且为了将逻辑排除在我的 Entity 之外,我选择在两者之间实现 ModelArray 类。EntityA 类被持久化到数据库中,子对象也随之保存在数据库中。
现在我想创建一个表单,我可以在其中一次编辑 EntityA 数组的所有 A 实例的 $->bool 属性。所以我提供的是array<EntityA>
.
然后我会进行如下操作:
//In a controller action
$data = array(
'as' => $arrayOfEntityA,
);
$form = $this->createForm(new GridType(), $data);
// Create view, render
我的表单类型如下所示:
class GridType extends AbstractType {
public function getName() {
return 'a_grid';
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('as', 'collection', array(
'type' => new GridAType(),
));
}
}
并使用此表单类型
class GridAType extends AbstractType {
public function getName() {
return 'a_grid_a';
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('modelArray', new ModelArrayType());
}
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'EntityA',
);
}
}
带模型数组类型
class ModelArrayType extends AbstractType {
public function getName() {
return 'model_array';
}
public function buildForm(FormBuilderInterface $builder, array $options) {
// ???
}
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'ModelArray',
);
}
}
请注意// ???
:我只想编辑存储在 ModelArray 中的 As 的布尔属性,并且我认为要继续的适当表单类型将是“集合”。但是我真的不知道如何在$modelArray->array
这里使用数组()作为集合。我该怎么做?
然后,我不完全确定为了实现一个可用的表单而实现这么多表单类型是否是一种好习惯。有不同的更好的方法吗?