通用反序列化:JSON 对象的 ID 值
Generic Deserializing : JSON ID value to Object
我在用什么:
我正在使用 JMSSerializerBundle 从 POST 请求反序列化我的 JSON object
。
问题描述:
我的 JSON
中的一个值是 Id
。我想在反序列化发生之前用正确的对象替换此 Id。
很遗憾,JMSSerializerBundle
没有 @preDeserializer
注释。
我面临的问题(如果有 @preDeserializer 注释,我也会面临)是我想为我的所有实体创建一个通用函数。
问题:
如何以最通用的方式将我的 Id
替换为相应的 object
?
你也像我一样做你自己的水合作用(使用 Doctrine):
解决方案
IHydratingEntity
是我所有实体实现的接口。
hydrate
函数一般在我的 BaseService 中使用。参数是实体和 json 对象。
在每次迭代中,该函数将测试该方法是否存在,然后它将调用 reflection
函数来检查参数的方法 (setter) 是否也实现了 IHydratingEntity
。
如果是这样,我使用 id
通过 Doctrine ORM 从数据库中获取实体。
我认为可以优化这个过程,所以请务必分享您的想法!
protected function hydrate(IHydratingEntity $entity, array $infos)
{
#->Verification
if (!$entity) exit;
#->Processing
foreach ($infos as $clef => $donnee)
{
$methode = 'set'.ucfirst($clef);
if (method_exists($entity, $methode))
{
$donnee = $this->reflection($entity, $methode, $donnee);
$entity->$methode($donnee);
}
}
}
public function reflection(IHydratingEntity $entity, $method, $donnee)
{
#->Variable declaration
$reflectionClass = new \ReflectionClass($entity);
#->Verification
$idData = intval($donnee);
#->Processing
foreach($reflectionClass->getMethod($method)->getParameters() as $param)
{
if ($param->getClass() != null)
{
if ($param->getClass()->implementsInterface(IEntity::class))
#->Return
return $this->getDoctrine()->getRepository($param->getClass()->name)->find($idData);
}
}
#->Return
return $donnee;
}
我在用什么:
我正在使用 JMSSerializerBundle 从 POST 请求反序列化我的 JSON object
。
问题描述:
我的 JSON
中的一个值是 Id
。我想在反序列化发生之前用正确的对象替换此 Id。
很遗憾,JMSSerializerBundle
没有 @preDeserializer
注释。
我面临的问题(如果有 @preDeserializer 注释,我也会面临)是我想为我的所有实体创建一个通用函数。
问题:
如何以最通用的方式将我的 Id
替换为相应的 object
?
你也像我一样做你自己的水合作用(使用 Doctrine):
解决方案
IHydratingEntity
是我所有实体实现的接口。
hydrate
函数一般在我的 BaseService 中使用。参数是实体和 json 对象。
在每次迭代中,该函数将测试该方法是否存在,然后它将调用 reflection
函数来检查参数的方法 (setter) 是否也实现了 IHydratingEntity
。
如果是这样,我使用 id
通过 Doctrine ORM 从数据库中获取实体。
我认为可以优化这个过程,所以请务必分享您的想法!
protected function hydrate(IHydratingEntity $entity, array $infos)
{
#->Verification
if (!$entity) exit;
#->Processing
foreach ($infos as $clef => $donnee)
{
$methode = 'set'.ucfirst($clef);
if (method_exists($entity, $methode))
{
$donnee = $this->reflection($entity, $methode, $donnee);
$entity->$methode($donnee);
}
}
}
public function reflection(IHydratingEntity $entity, $method, $donnee)
{
#->Variable declaration
$reflectionClass = new \ReflectionClass($entity);
#->Verification
$idData = intval($donnee);
#->Processing
foreach($reflectionClass->getMethod($method)->getParameters() as $param)
{
if ($param->getClass() != null)
{
if ($param->getClass()->implementsInterface(IEntity::class))
#->Return
return $this->getDoctrine()->getRepository($param->getClass()->name)->find($idData);
}
}
#->Return
return $donnee;
}