2014-12-20 39 views
0

我在Symfony 2.6.1项目中使用了Doctrine 2.4.6。问题在于preUpdate回调中对实体所做的更改未保存在数据库中。代码如下:学说preUpdate实际上并没有改变实体

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. 
    } 
} 
+0

仔细阅读印刷精美/en/latest/reference/events.html#preupdate这是混淆的常见来源。 preUpdate事件有很多限制。 – Cerad

回答

0

preUpdate不允许您更改实体。您只能使用传递给事件的计算更改集来修改原始字段值。我敢打赌,如果您检查数据库,您将看到Person实体确实得到更新,您只是在$persons变量中看不到它们,直到下次手动检索它们。

什么,你就必须做后冲洗是从数据库中检索实体看到自己的更新值:http://doctrine-orm.readthedocs.org:

$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'));