Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony JMS序列化程序:如何限制对象图的序列化深度_Symfony_Jmsserializerbundle - Fatal编程技术网

Symfony JMS序列化程序:如何限制对象图的序列化深度

Symfony JMS序列化程序:如何限制对象图的序列化深度,symfony,jmsserializerbundle,Symfony,Jmsserializerbundle,也许这只是我对这个注释的误解,但是它并没有像预期的那样工作 我有下面的对象图 User -> Company -> Users -> Groups -> Permissions 正如你所看到的,将会有一些递归。JMS不序列化其他用户的公司属性,也不序列化当前用户,从而很好地处理了这一问题 然而,我希望序列化停止在并包括公司 我尝试过这个方法,希望一旦级别$context->level=2,它就会停止 <?php namespace FinalC

也许这只是我对这个注释的误解,但是它并没有像预期的那样工作

我有下面的对象图

User
 -> Company
  -> Users
   -> Groups
    -> Permissions
正如你所看到的,将会有一些递归。JMS不序列化其他用户的公司属性,也不序列化当前用户,从而很好地处理了这一问题

然而,我希望序列化停止在并包括公司

我尝试过这个方法,希望一旦级别$context->level=2,它就会停止

<?php
namespace FinalConcept\TimeTracker\EntitiesBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * FinalConcept\TimeTracker\EntitiesBundle\Entity
 *
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="FinalConcept\TimeTracker\EntitiesBundle\Repository\UserRepository")
 */
class User implements UserInterface, \Serializable
{
     /**
     * @ORM\ManyToOne(targetEntity="company", inversedBy="users")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
     * @JMS\MaxDepth(depth=1)
     */
    private $company;
}

提前感谢您提供的有关如何限制对象图序列化深度的帮助

,因为我无法访问最新版本的序列化程序,所以我必须找到@MaxDepth的解决方法。这也可能对你有所帮助

User
 -> Company
  -> Users
   -> Groups
    -> Permissions
在连接的所有实体上使用@JMS\ExclutionPolicy(“全部”)

现在,仅在您希望序列化的属性上使用@JMS\Expose。 在连接关系上,仅在一个方向上使用此注释。那会解决你的问题

namespace FinalConcept\TimeTracker\EntitiesBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * FinalConcept\TimeTracker\EntitiesBundle\Entity
 *
 * @JMS\ExclusionPolicy("all")
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="FinalConcept\TimeTracker\EntitiesBundle\Repository\UserRepository")
 */
class User implements UserInterface, \Serializable
{
     /**
     * @JMS\Expose
     * @ORM\ManyToOne(targetEntity="company", inversedBy="users")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
     */
    private $company;
}

从最新版本开始,在控制器中使用@MaxDepth()注释和SerializationContext::create()->enableMaxDepthChecks()可以完成这项工作。

嘿,谢谢你的精彩回复。是否可以在孔类??无sry上提及
@MaxDepth
@MaxDepth被标记为property/methodannontation@Target({“property”,“Method”})嘿,谢谢你的回复。是否可以在孔类中提及
@MaxDepth
??