Symfony + JMSSerializer 抛出 500 - handleCircularReference

Symfony + JMSSerializer throw 500 - handleCircularReference

我正在尝试将 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;
}

现在我想用他们的 User 获得所有 Cars

我的控制器:

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 错误:

A circular reference has been detected when serializing the object of class \"App\Entity\Car\" (configured limit: 1)

好的,听起来很清楚。 JMS正在尝试获取每辆汽车与用户,并去汽车和用户....

所以我的问题是:如何防止这种行为?我只想要所有的汽车和他们的用户,在此之后,应该停止迭代。

您需要添加最大深度检查以防止循环引用。 这可以在文档 here

中找到

基本上,如果您使用 XML/YML 配置,则添加 @MaxDepth(1) 注释或配置 max_depth。然后这样序列化:

use JMS\Serializer\SerializationContext;

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

示例 Car class 带有 MaxDepth 注释:

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