我正在尝试为多个实体构建表单。我先介绍一些示例类:
为清楚起见,我没有显示所有注释或缩写它们,我也没有显示use或namespace命令。
/**
* 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实例的$ - &gt; 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
)作为集合。
我该怎么做?
那么,我不完全确定实现这么多表单类型是否是一种好的做法,只是为了实现一种可用的形式。有没有不同的更好的方式?