Symfony нормализует массив строк в сущности - PullRequest
0 голосов
/ 14 октября 2019

Я получаю полезную нагрузку, которая выглядит следующим образом:

{
    "date": "2019-03-14 14:48:26 +0000",
    "events": [
    "E09FDE82-4CAA-4641-87AF-6C092D6E71C1",
    "AE12A6BC-DA37-4C37-BF49-DD0CE096AE00"
    ],
    "location": null
}

Объект-оболочка - это объект Animal, а события - это массив UUID, которые принадлежат объектам Event. Они могут или не могут существовать в таблице событий.

Я хочу иметь возможность сериализовать это в сущность Animal, используя сериализатор Symfony, например:

$serializer = $this->get("serializer");
    if($request->getMethod() == Request::METHOD_POST) {
        $data = $request->getContent();
        $entity = $serializer->deserialize($data, $this->type, 'json');
        ...
        ...

Что я хотел быво время десериализации мне нужно искать этот конкретный ключ и перебирать его, создавая новые события (или получая существующие) и вызывая установщик на животных с этими.

Я посмотрел на symfonyнормализаторы, но я не думаю, что это правильные вещи? Я сделал это, но не уверен, куда идти отсюда:

<?php

namespace App\Normalizer;

use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

use App\Entity\Event;


class EventNormalizer implements NormalizerInterface {

    private $normalizer;

    public function __construct(ObjectNormalizer $normalizer){
        $this->normalizer = $normalizer;
    }

    public function normalize($event, $format = null, array $context = [])
    {
        $data = $this->normalizer->normalize($event, $format, $context);

        return $data;
    }

    public function supportsNormalization($data, $format = null, array $context = [])
    {
        return $data instanceof Event;
    }
}

Согласно документации, это то, как вы могли бы редактировать существующие значения или добавлять новые, но я понятия не имею, как я скажу нормализатору, что«эй, когда ты видишь этот ключ, ты встал, делай свое дело».

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 15 октября 2019

Здесь вам нужно Denormalizer, попробуйте реализовать DenormalizerInterface

class EventNormalizer implements NormalizerInterface, DenormalizerInterface {

   ...

    public function denormalize($data, string $type, string $format = null, array $context = []) 
    {
        // retrieve your events from $data and return the object (Animal) with related events
        // $this->entityManager->find($data['events'][0]) ... 
    }

    public function supportsDenormalization($data, string $type, string $format = null)
    {
        // your code here
    }
}
...