Symfony 4-序列化类“ App \ Entity \ User”的对象时检测到循环引用(配置的限制:1)

您好,我遇到了一个导致此错误的问题:

  

序列化以下对象时检测到循环引用   类“ App \ Entity \ User”(配置限制:1)

我有一个企业实体,其中包含任务订单,车辆和用户。

与用户,公司和车辆有关系的订单实体。

还有一个与订单和公司有关系的用户实体。

所以我有这个: Entreprise.php

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


    /**
     * @ORM\OneToMany(targetEntity="App\Entity\User",mappedBy="entreprise",orphanRemoval=true)
     */
    private $users;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Vehicule",orphanRemoval=true)
     */
    private $vehicules;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\OrdreMission",orphanRemoval=true)
     */
    private $ordreMissions;

OrdreMission.php:

class OrdreMission
{

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

    /**
     * Agent qui réalisera la mission
     * @ORM\ManyToOne(targetEntity="App\Entity\User",inversedBy="ordreMissions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;


    /**
     * Immatriculation de la voiture de service
     * @ORM\ManyToOne(targetEntity="App\Entity\Vehicule")
     */
    private $vehicule;



    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise",inversedBy="ordreMissions")
     * @ORM\JoinColumn(nullable=false)
     */
    private $entreprise;

Vehicule.php:

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

    /**
     * Marque du véhicule
     * @ORM\Column(type="string",length=255)
     */
    private $marque;

    /**
     * Modèle du véhicule
     * @ORM\Column(type="string",length=255)
     */
    private $modele;

    /**
     * Immatriculation du véhicule
     * @ORM\Column(type="string",length=255)
     * @MaxDepth(2)
     */
    private $immatriculation;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise",inversedBy="vehicules")
     * @ORM\JoinColumn(nullable=false)
     * @MaxDepth(2)
     */
    private $entreprise;

User.php:

class User implements UserInterface,Serializable
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * Adresse email de l'utilisateur
     * @ORM\Column(type="string",length=180,unique=true)
     * @Assert\NotBlank()
     * @Assert\Email(message="Veuillez renseigner un email valide")
     */
    private $email;

    /**
     * Rôles de l'utilisateur
     * @ORM\Column(type="json")
     */
    private $roles = [];


    /**
     * Ordres de mission de l'utilisateur
     * @ORM\OneToMany(targetEntity="App\Entity\OrdreMission",mappedBy="user")
     */
    private $ordreMissions;


    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise",inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     */
    private $entreprise;

/**
 * String representation of object
 * @link http://php.net/manual/en/serializable.serialize.php
 * @return string the string representation of the object or null
 */
public function serialize()
{
    return serialize([
        $this->id,$this->email,$this->password,]);
}

/**
 * Constructs the object
 * @link http://php.net/manual/en/serializable.unserialize.php
 * @param string $serialized <p>
 * The string representation of the object.
 * </p>
 * @return void
 */
public function unserialize($serialized)
{
    list (
        $this->id,) = unserialize($serialized);
}

当我要添加新车时,出现错误:

  

序列化以下对象时检测到循环引用   类“ App \ Entity \ User”(配置限制:1)

我在互联网上看到我必须以“最大深度”来做某事,但我不知道我该做些什么,确切地在什么地方

更新:

这是我用来添加Vehicle Object并将其发送的功能控制器:

   /**
     * Pour créer un nouveau véhicule
     * 
     * @Route("/chef-service/ordres-mission/new/new-vehicule",name="vehicule_create")
     * @IsGranted({"ROLE_CHEF_SERVICE"})
     * @Method({"POST"})
     * @return Response
     */
    public function createVehicule(Request $request,EntityManagerInterface $manager)
    {
        $vehicule = new Vehicule();
        $vehicule->setEntreprise($this->adminService->getEntreprise());

        $form = $this->createForm(VehiculeType::class,$vehicule,[
            'action' => $this->generateUrl($request->get('_route'))
        ]);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $encoders = array(new XmlEncoder(),new JsonEncoder());
            $normalizers = array(new ObjectNormalizer());
            $serializer = new Serializer($normalizers,$encoders);
            $manager->persist($vehicule);
            $manager->flush();

            $result = $serializer->normalize(
                [
                    'code' => 200,'message' => 'OK','vehicule' => $vehicule,],null,[AbstractObjectNormalizer::ENABLE_MAX_DEpth => true]
            );

            $jsonContent = $serializer->serialize(
                $result,'json'
            );
            return new Response($jsonContent);

        }

        return $this->render('ordre_mission/partials/newVehicule.html.twig',[
            'formVehicule' => $form->createView(),]);
    }
ccczzzxxx 回答:Symfony 4-序列化类“ App \ Entity \ User”的对象时检测到循环引用(配置的限制:1)

就我而言,我已固定注入序列化程序服务,而不是在controller方法中创建新的Serializer实例。

use Symfony\Component\Serializer\SerializerInterface;

//...
public function createOrder(Request $request,SerializerInterface $serializer)
{
    //...
    $json = $serializer->serialize($order,'json',['groups' => ['normal']]);
    //...
}
,

尝试通过使用序列化组来避免循环引用(Symfony序列化器和jms序列化器都可以使用)。 当您序列化“用户”而不序列化其他实体的“用户”时的示例。

用户

class User 
{

/**
 * @Groups("user")
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @Groups("user")
 * @ORM\ManyToOne(targetEntity="App\Entity\Entreprise",inversedBy="users")
 * @ORM\JoinColumn(nullable=false)
 */
private $entreprise;
}

企业

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


/**
 * @Groups("user_detail")
 * @ORM\OneToMany(targetEntity="App\Entity\User",mappedBy="entreprise",orphanRemoval=true)
 */
private $users;

然后

$json = $serializer->serialize(
    $user,['groups' => ['user','entreprise' /* if you add "user_detail" here you get circular reference */]
);

但是您还有两个选择,可以使用Handling Circular References或使用Handling Serialization Depth

,

我利用了 ControllerTrait 的方法“json”:

return $this->json($result,Response::HTTP_OK,[],['groups' => 'user','entreprise']);

它对我有用。

,

对我来说,当我使用 API 平台时会发生此错误(可能与此案例无关,但可能对其他人有帮助)我必须遵循此comment here

因为Entity没有标注@ApiResource,所以不是 由 API 平台处理(由 Symfony 处理),并且在那里 是循环引用,抛出错误。如果这个实体在哪里 API 资源,循环引用将被自动处理。 如果你不想让它成为资源,你需要注册一个 自己的循环引用处理程序: https://symfony.com/doc/current/components/serializer.html#handling-circular-references

本文链接:https://www.f2er.com/2948888.html

大家都在问