我在我的Symfony 2.6.1项目中使用了Doctrine 2.4.6。问题是在预更新回调中对实体所做的更改不会保存在数据库中。代码如下:
class MyListener {
public function preUpdate(PreUpdateEventArgs $args) {
$entity = $args->getEntity();
$args->setNewValue('name', 'test');
// echo $args->getNewValue('name'); --> prints 'test'
}
}
class DefaultController extends Controller {
/**
* @Route("/commit", name="commit")
*/
public function commitAction(Request $request) {
$content = $request->getContent();
$serializer = $this->get('jms_serializer');
/* @var $serializer 'JMS'Serializer'Serializer */
$em = $this->getDoctrine()->getManager();
/* @var $em 'Doctrine'Orm'EntityManagerInterface */
$persons = $serializer->deserialize($content, 'ArrayCollection<AppBundle'Entity'Person>', 'json');
/* @var $persons 'AppBundle'Entity'Person[] */
foreach($persons as $person) {
$em->merge($person);
}
$em->flush();
return new JsonResponse($serializer->serialize($persons, 'json'));
// Person name is NOT 'test' here.
}
}
preUpdate
不允许对实体进行更改。 只能使用传递给事件的计算更改集来修改基元字段值。 我敢打赌,如果您检查数据库,您会发现 Person 实体确实得到了更新,直到下次手动检索它们时,您才会在 $persons
变量中看到它们。
刷新后,您必须执行的操作是从数据库中检索实体以查看其更新值:
$em->flush();
$personIds = array_map(function($person) { return $person->getId(); }, $persons);
$updatedPersons = $em->getRepository('AppBundle:Person')->findById($personIds);
return new JsonResponse($serializer->serialize($updatedPersons, 'json'));