在JMS Serializer上反序列化期间构造对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JMS Serializer上反序列化期间构造对象相关的知识,希望对你有一定的参考价值。

我尝试在反序列化期间使用JMS Serializer从数据库(Symfony,Doctrine)加载对象。让我们说我有一个简单的足球api应用程序,两个实体Team和Game,id为45和46的团队已经在db中。

从json创建新游戏时:

{
  "teamHost": 45,
  "teamGues": 46,
  "scoreHost": 54,
  "scoreGuest": 42,

}

游戏实体:

class Game {

    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMManyToOne(targetEntity="AppEntityTeam")
     * @ORMJoinColumn(nullable=false)
     */
    private $teamHost;

    /**
     * @ORMManyToOne(targetEntity="AppEntityTeam")
     * @ORMJoinColumn(nullable=false)
     */
    private $teamGuest;

我想创建一个已经从数据库加载团队的Game对象。

$game = $this->serializer->deserialize($requestBody, AppEntityGame::class, 'json');

寻找解决方案我发现像jms_serializer.doctrine_object_constructor,但文档中没有具体的例子。您是否能够帮助我在反序列化期间从数据库中创建对象?

答案

您需要创建一个自定义处理程序:https://jmsyst.com/libs/serializer/master/handlers

一个简单的例子:

<?php

namespace AppSerializerHandler;


use AppEntityTeam;
use DoctrineORMEntityManagerInterface;
use JMSSerializerContext;
use JMSSerializerGraphNavigator;
use JMSSerializerHandlerSubscribingHandlerInterface;
use JMSSerializerJsonDeserializationVisitor;

class TeamHandler implements SubscribingHandlerInterface
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public static function getSubscribingMethods()
    {
        return [
            [
                'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
                'format' => 'json',
                'type' => Team::class,
                'method' => 'deserializeTeam',
            ],
        ];
    }

    public function deserializeTeam(JsonDeserializationVisitor $visitor, $id, array $type, Context $context)
    {
        return $this->em->getRepository(Team::class)->find($id);
    }
}

虽然我建议使用通用方法来处理单个处理程序所需的实体。

示例:https://gist.github.com/Glifery/f035e698b5e3a99f11b5

此外,此问题之前已被问过:JMSSerializer deserialize entity by id

以上是关于在JMS Serializer上反序列化期间构造对象的主要内容,如果未能解决你的问题,请参考以下文章

JMS 反序列化不适用于排除策略

在使用 Jackson 反序列化期间选择性地忽略 JSON 属性

FOSRestbundle、JMS Serializer 和 SonataMediaBundle 返回图像的公共 url

DRF Serializer 的many参数是干嘛的

RuntimeError:尝试在 CUDA 设备上反序列化对象,但 torch.cuda.is_available() 为 False,Dataloader 错误,并且设置 pin_memory=Fa

20-Django REST framework-Serializer序列化器