Вернуть массив сериализованных данных в Symfony 4 - PullRequest
0 голосов
/ 10 апреля 2019

Symfony 4. У меня есть 2 энтита, Cat и Dog, которые должны быть сериализованы, а затем возвращены как JSON-ответ, подобный этому:

{
  'cats': // array of serialized cat data
  'dogs': // array of serialized dog data
}

Это то, что я имею до сих пор:

Контроллер:

public function index()
{
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Dog::class);
    $dogs = $repository->findAll();
    return new JsonResponse([
        'cats' => $this->serializeData($cats, 'cats'),
        'dogs' => $this->serializeData($dogs, 'dogs'),
    ], 200);
}

И мой serializeData метод выглядит так:

protected function serializeData($data, $group)
{
    return $this->json($data, $this->statusCode, [], [
        'groups' => [$group]
    ]);
}

Вот немного сущности Cat:

use Symfony\Component\Serializer\Annotation\Groups;
[...]
/**
 * @ORM\Entity(repositoryClass="App\Repository\CatRepository")
 */
class Cat
{
    [...]
    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("cats")
     */
    private $name;
    [...]
}

Проблема: при попадании в эту конечную точку вместо данных, которые я получаю:

{
    "cats": {
        "headers": {}
    },
    "dogs": {
        "headers": {}
    }
}

headers не является частью какой-либо организации.

EDIT:

Что еще я пробовал:

public function index()
{
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Dog::class);
    $dogs = $repository->findAll();
    return new JsonResponse([
        'cats' => $this->container->get('serializer')->serialize($cats, 'json', [
            'groups' => ['cats'],
        ])
        'dogs' => $this->container->get('serializer')->serialize($dogs, 'json', [
            'groups' => ['dogs'],
        ])
    ], 200);
}

Такого рода работы, но new JsonResponse сериализует уже сериализованных кошек и собак. И конечно, если я заменю new JsonResponse на new Response, я получу ошибку

Содержимое Ответа должно быть строкой или объектом, реализующим __toString (), заданный «массив».

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

хорошо, метод $ this-> json возвращает JsonResponse, поэтому весь материал возвращает JsonResponse (JsonResponse ...) - source

public function index()
{
...
    return $this->json(['cats' => $cats, 'dogs' => $dogs], 200, [], ['groups' => ['cats', 'dogs']]);
}
1 голос
/ 10 апреля 2019

Вы можете использовать компонент Symfony Serializer:

https://symfony.com/doc/master/components/serializer.html

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