3

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

我有以下对象图

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;
}

然而,这种情况并非如此。即使单步执行代码也没有说明如何阻止这种情况。

如果我只能为特定路径(即 User.Company)调用它,我很高兴创建一个自定义处理程序

对于具有下图的 User.Groups 我也需要这个

User
 -> Groups
  -> Permissions
 -> Users
   -> Groups
     -> users ....

提前感谢任何帮助如何限制对象图的序列化深度

4

2 回答 2

7

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

对所有连接的实体使用 @JMS\ExclusionPolicy("all")。

现在仅在您想要序列化的那些属性上使用@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;
}
于 2014-05-19T16:08:23.163 回答
4

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

于 2016-10-10T07:32:29.390 回答