Symfony + JMSSerializer抛出500-handleCircularReference

时间:2018-11-08 10:16:23

标签: symfony symfony4 jmsserializerbundle jms-serializer

我正在尝试将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 :(得分:3)

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

中找到

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

use JMS\Serializer\SerializationContext;

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

带有Car注释的示例MaxDepth类:

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