Symfony SerializerInterface десериализует json, чтобы класс не работал - PullRequest
0 голосов
/ 09 мая 2020

Вот мой код контроллера для получения запроса POST с телом JSON, который затем я хотел бы десериализовать в свой dto. Звучит просто, но по какой-то причине работает не так, как ожидалось. Одно из свойств - это массив объектов, и при десериализации он десерилизуется в массив массивов

Контроллер:

 <?php

    namespace App\Controller;  
    use Symfony\Component\Serializer\SerializerInterface;
    use App\Dto\CreateDto;

            class EntryController extends AbstractController
        {

            public function __construct(SerializerInterface $serializer)
            {
                $this->serializer = $serializer;
            }

            /**
             * @Route("", methods={"POST"})
             * 
             */
            public function createEntry(Request $request)
            {
                 $content = $request->getContent();

                 $entry = $this->serializer->deserialize($content, CreateDto::class, 'json');

                 ...
            }
        }

DTO:

<?php

namespace App\Dto;


class CreateDto
{
    public $name;
    public $email;
    public $items; // this is CreateDto[]
}

Я делаю запрос с использованием запроса POST почтальона с типом содержимого тела json

 {
        "name": "Example",
        "email": "example@example",
        "items": [
               {
                  "name": "sub",
                  "email": "somethig@example.com"
               }
         ]
    }

Symfony версия 5.0.8

1 Ответ

0 голосов
/ 09 мая 2020

Вам необходимо объявить, какие поля являются сериализованными или десериализованными.

<?php

namespace App\Dto;

use Symfony\Component\Serializer\Annotation\Groups;


class CreateDto
{
    /**
     * @Groups({"api""})
     */
    public $name;
    /**
     * @Groups({"api""})
     */
    public $email;
    /**
     * @Groups({"api""})
     */
    public $items; // this is CreateDto[]
}

После этого

 $entry = $this->serializer->deserialize($content, CreateDto::class, 'json', ["groups" => "api"]);

Укажите сериализатор, в какие группы следует сериализовать или десериализовать. Вот так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...