Построить объект при десериализации на JMS Serializer - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь загрузить объект из базы данных (Symfony, Doctrine) во время десериализации с использованием JMS Serializer.Допустим, у меня есть простое приложение api football, две сущности Team и Game , команды с id 45 и 46 уже в db.

При создании новойигра от json:

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

}

Игровая сущность:

class Game {

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Team")
     * @ORM\JoinColumn(nullable=false)
     */
    private $teamHost;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Team")
     * @ORM\JoinColumn(nullable=false)
     */
    private $teamGuest;

Я хотел бы создать Game объект, который уже загруженкоманды из базы данных.

$game = $this->serializer->deserialize($requestBody, \App\Entity\Game::class, 'json');

В поисках решения я нашел что-то вроде jms_serializer.doctrine_object_constructor, но в документации нет конкретных примеров.Можете ли вы помочь мне с созданием объекта из базы данных во время десериализации?

1 Ответ

0 голосов
/ 26 ноября 2018

Вам необходимо создать собственный обработчик: https://jmsyst.com/libs/serializer/master/handlers

Простой пример:

<?php

namespace App\Serializer\Handler;


use App\Entity\Team;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\JsonDeserializationVisitor;

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 десериализует сущность по id

...