ZF2和Doctrine2嵌套表单和绑定问题

时间:2015-09-14 12:45:46

标签: php zend-framework doctrine-orm zend-framework2

我在 ZF2(2.4.2)中使用Doctrine2,形成和保湿面临一个非常奇怪的错误。

假设这个一对多模型有3个级别:
实体1 - >实体2 - > ENTITY3
(Entity1有很多Entity2,Entity2有很多Entity3)。

class Entity1 {
    /**
     * @ORM\OneToMany(targetEntity="Entity2", mappedBy="entity1", orphanRemoval=true, cascade={"persist", "remove", "merge"})
     */
    protected $entities2;    
}

class Entity2 {
    /**
     * @ORM\ManyToOne(targetEntity="Entity1", inversedBy="entities2")
     */
    protected $entity1;
    /**
     * @ORM\OneToMany(targetEntity="Entity3", mappedBy="entity2", orphanRemoval=true, cascade={"persist", "remove", "merge"})
     */
    protected $entities3;    
}

class Entity3 {
    /**
     * @ORM\ManyToOne(targetEntity="Entity2", inversedBy="entities3")
     */
    protected $entity2;  
}

我使用一组Zend Forms和Fieldset来构建Entity1对象的完整可编辑视图。

class Entity1Form {
    public function __construct(EntityManager $entityManager) {

        // Some elements ...

        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'entities2',
            'options' => array(
                'count' => 0,
                'should_create_template' => true,
                'allow_add' => true,
                'allow_remove' => true,
                'target_element' => new Entity2Fieldset($entityManager)
            )    
        ));

        $this->setHydrator(new DoctrineObject($entityManager))->setObject(new Entity1());
    }
}

class Entity2Fieldset {
    public function __construct(EntityManager $entityManager) {

        // Some elements ...

        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'entities3',
            'options' => array(
                'count' => 0,
                'should_create_template' => true,
                'allow_add' => true,
                'allow_remove' => true,
                'target_element' => new Entity3Fieldset($entityManager)
            )    
        ));

        $this->setHydrator(new DoctrineObject($entityManager))->setObject(new Entity2());
    }
}

class Entity3Fieldset {
        public function __construct(EntityManager $entityManager) {

            // Some elements ...

            $this->setHydrator(new DoctrineObject($entityManager))->setObject(new Entity3());
        }
    }

真的很奇怪如下:

当我将Entity1对象绑定到Entity1Form时,每个值都在Entity1Form,Entity2Fieldset和Entity3Fieldset的所有元素中正确设置。当我提交表单时,Entity1对象被正确地水合并且属性值被更改(关系也被正确管理 - 添加,删除......)。
但是,您可能知道我们可以使用getObject()功能访问表单或字段集的绑定对象。
当我做的时候:

....
$entity1Form = new Entity1Form($em);
$entity1Form->bind($entity1);

$entity1Form->getObject(); // Full binded entity1 object containing relations
$entity1Form->get('aProperty')->getValue(); // Good value
foreach($entity1Form->get('entities2') as $entity2Fieldset) {
    $entity2Fieldset->getObject(); // Full binded entity2 object containing relations
    $entity2Fieldset->get('anotherProperty')->getValue(); // Good value
    foreach($entity2Fieldset->get('entities3') as $entity3Fieldset) {
        $entity3Fieldset->getObject(); // WTF ? An empty entity3 object
        $entity3Fieldset->get('againAnotherProperty')->getValue(); // Good value but WTF AGAIN
    }
}

我想知道为什么$entity3Fieldset->getObject()返回一个空的Entity3对象,而其值正确绑定到fieldset元素,并且它对第二个lvl(又名Entity2)有效。 我需要在我的代码中使用这个Entity3对象,这样做是不可能的(这似乎是最合乎逻辑和最干净的)。 我这个问题毁了我的脑袋......

0 个答案:

没有答案