我正在尝试将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试图让每辆车都与用户一起,并转到汽车和用户....
所以我的问题是:如何防止这种行为?我只希望所有汽车都与他们的用户在一起,然后,应该停止迭代。
答案 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;