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 に答える