我的控制器中有一个方法从JMSSerializerBundle获取反序列化的对象并返回完整的对象,准备保留。我这样做的原因是返回更新的对象,因此,当它保持不变时,它不会将所有内容重置为默认值。
运行时,此方法会在指定的行上抛出ErrorException
并将其放入我的日志中:Warning: ReflectionProperty::setValue() expects parameter 1 to be object, null given in C:\DevelopmentProjects\keobi-web\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadata.php line 177 (uncaught exception) at C:\DevelopmentProjects\keobi-web\vendor\symfony\src\Symfony\Component\HttpKernel\Debug\ErrorHandler.php line 65
由于某种原因,EntityManager
方法find
正在返回(根据get_class
)DefaultController
,此方法的控制器类。并且setFieldValue
表示它是NULL。
令我困惑的一件事是,如果找不到实体,应该抛出Doctrine\ORM\EntityNotFoundException
。它没有被抛出。所以,它显然找到了实体,而不是正确地返回它......
传入参数$data
是JSMSerializerBundle反序列化的对象。 $em
绝对是EntityManager
,$metadata
绝对是ClassMetadata
。
我在这里不知所措。不知道如何继续。
受保护的功能processEntity($ data)
{
$ em = $ this-&gt; getDoctrine() - &gt; getEntityManager(); $ metadata = $ em-&gt; getClassMetadata(get_class($ data)); $ fqcn = $ metadata-&gt; getName(); $ blankEntity = new $ fqcn(); $ id = array();$this->get('logger')->debug('Incoming object type: ' . get_class($data)); # Keobi\ModelBundle\Entity\User $this->get('logger')->debug('Blank entity type: ' . get_class($blankEntity)); # Keobi\ModelBundle\Entity\User $this->get('logger')->debug('FQCN: ' . $fqcn); # Keobi\ModelBundle\Entity\User foreach ($metadata->getIdentifierFieldNames() as $identifier) { $id[$identifier] = $metadata->getFieldValue($data, $identifier); if (!$id[$identifier]) { $this->get('logger')->debug(sprintf("Identifer '%s' missing. Assuming the object is new.", $identifier)); return $data; } } $entity = $em->find($metadata->getName(), $id); $this->get('logger')->debug(get_class($entity)); # Keobi\RestAPIBundle\DefaultController foreach ($metadata->getFieldNames() as $field) { $value = $metadata->getFieldValue($data, $field); $default = $metadata->getFieldValue($blankEntity, $field); if ($value <> $default) { $metadata->setFieldValue($entity, $field, $value); # <- throws ErrorException $this->get('logger')->debug(sprintf("Updated field '%s' in %s", $field, get_class($entity))); } } return $entity;
}
答案 0 :(得分:1)
看起来Doctrine2存在问题。我将其更新为Github repo的最新HEAD提交。让我感到困惑的是,这种方法实际上不久前就起作用了。
无法找到解决问题的确切提交,但在撰写本文时,提交为93cef612701b9e8caaf43c745978cd4fbd9d4e4e。
答案 1 :(得分:0)
$entity = $em->find($metadata->getName(), $id);
您需要指定要搜索的存储库,例如:
$entity = $em->getRepository('EntitiesBundle:Entity')->find(...)