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 (), заданный «массив».