教义更新前实际上并没有改变实体


Doctrine preUpdate does not actually change entity

我在我的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'));