Symfony 2形式:实体数组

时间:2013-04-18 09:18:29

标签: php forms symfony doctrine-orm mapping

我正在尝试为多个实体构建表单。我先介绍一些示例类:

为清楚起见,我没有显示所有注释或缩写它们,我也没有显示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)作为集合。 我该怎么做?

那么,我不完全确定实现这么多表单类型是否是一种好的做法,只是为了实现一种可用的形式。有没有不同的更好的方式?

0 个答案:

没有答案