con*_*ept 3 symfony jmsserializerbundle
也许这只是我对这个注释的误解,然而它并没有按预期工作.
我有以下对象图
User
-> Company
-> Users
-> Groups
-> Permissions
Run Code Online (Sandbox Code Playgroud)
如你所见,会有一些递归.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;
}
Run Code Online (Sandbox Code Playgroud)
然而,这种情况并非如此.即使单步执行代码也没有说明如何阻止它.
我很乐意创建一个自定义处理程序,如果我只能为特定路径调用它,即User.Company
对于具有以下图形的User.Groups,我也需要这个
User
-> Groups
-> Permissions
-> Users
-> Groups
-> users ....
Run Code Online (Sandbox Code Playgroud)
预先感谢您提供有关如何限制对象图的序列化深度的任何帮助
因为我无法访问最新版本的序列化程序,所以我必须找到@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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9773 次 |
| 最近记录: |