Symfony + JMSSerializer скинуть 500 - handleCircularReference - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь использовать JMSSerializer с Symfony для создания простого json API.

Итак, у меня есть 2 простых объекта (1 пользователь может иметь много автомобилей, каждый автомобиль принадлежит одному пользователю):

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

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="cars")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;
}

class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Car", mappedBy="user", orphanRemoval=true)
     */
    private $cars;
}

Теперь я хочу получить все Cars с их User.

Мой контроллер:

class CarController extends AbstractController
{
    /**
     * @param CarRepository $carRepository
     *
     * @Route("/", name="car_index", methods="GET")
     *
     * @return Response
     */
    public function index(CarRepository $carRepository)
    {
        $cars = $carRepository->findAll();
        $serializedEntity = $this->container->get('serializer')->serialize($cars, 'json');

        return new Response($serializedEntity);
    }
}

Это выдаст ошибку 500:

При сериализации объекта класс \ "App \ Entity \ Car \" (настроенный лимит: 1)

Хорошо, звучит ясно. JMS пытается заполучить каждую машину вместе с пользователем и перейти к машинам и пользователю ....

Итак, мой вопрос: как предотвратить это поведение? Я просто хочу, чтобы все машины были у их пользователя, и после этого итерация должна быть остановлена.

1 Ответ

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

Вам необходимо добавить проверки максимальной глубины, чтобы избежать циклических ссылок. Это можно найти в документации здесь

Обычно вы добавляете аннотацию @MaxDepth(1) или настраиваете max_depth, если используете конфигурацию XML / YML. Затем сериализуйте так:

use JMS\Serializer\SerializationContext;

$serializer->serialize(
    $data,
    'json',
    SerializationContext::create()->enableMaxDepthChecks()
);

Пример Car класс с MaxDepth аннотацией:

class Car
{
    /** 
     * @\JMS\Serializer\Annotation\MaxDepth(1)
     *
     * [..]
     */
     private $user;
...