我在 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对象,这样做是不可能的(这似乎是最合乎逻辑和最干净的)。
我这个问题毁了我的脑袋......