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