我想制作一个修订选项,用于在Sonata Admin中保存某些对象。
我想以下列方式做到这一点:
revision
)所以代码看起来像这样(来源Sonata\AdminBundle\Controller\CRUDController::editAction()
):
$object = $this->admin->getObject($id);
$this->admin->setSubject($object);
$form = $this->admin->getForm();
$form->setData($object);
$form->bind($this->get('request')); // does this persist the object ?
// and here is what I basically want to do:
$object->setId(null);
$orig = $em->getRepository("MedtravelClinicBundle:Clinic")->find($id);
$orig->setRevision($object);
$this->admin->update($orig);
问题是$orig
加载了已经修改的内容,因此var_dump($orig === $object)
为true
。
我也试过$em->getUnitOfWork()->getOriginalEntityData($object);
- 它抓取了正确的数据,但是作为一个数组,而不是一个对象(这可能是最后的手段)。
那么,如何在表单绑定发生后获取(并保存)原始对象?
答案 0 :(得分:1)
我认为您应该使用clone
关键字来获取要存储的对象的独立实例。它应该按照以下步骤工作:
$object
)$newObject
)$newObject
以使其成为新条目:$newObject->setId(null);
$newObject
绑定到表单$newObject
作为修订$object
)并将其保留我希望如果表单无效,您将无法丢失用户发送的所有数据。
为了以防万一,我使用this answer来查找原始实体与表单修改的实体之间的差异。