2016-04-07 16 views
1

Symfonyを使用して簡単なカレンダーを作成しようとしています。このために、AJAX経由で選択した月のイベントをリクエストしたいと思います。各イベントには、複数のユーザーが接続できます。今イベントを取得小さい出力のエンティティを変換する

は明らかに、ユーザーが同様にそれらに接続されたイベントを持っているので、私はsetCircularReferenceHandlerに必要な

$events = $this->em->getRepository('AppBundle:Event') 
      ->findByYearMonth($this->getUser(), $year, $month); 

    $encoder = new JsonEncoder(); 
    $normalizer = new ObjectNormalizer(); 

    $normalizer->setCircularReferenceHandler(function ($object) { 
     return $object->getId(); 
    }); 

    $serializer = new Serializer([$normalizer], [$encoder]); 
    $serialized = $serializer->serialize($events, 'json'); 

    $response = new Response($serialized); 
    $response->headers->set('Content-Type', 'application/json'); 

非常に簡単です。

私のテストでは、現在のところ2つのイベントしかありませんが、ユーザーオブジェクトによって肥大化するため、〜50kbの応答が得られます。私が本当に欲しいのはユーザーIDと名前ですが、他のすべてのフィールド(および他の接続されたエンティティ)も取得します。

循環参照ハンドラ自体は、ユーザーが既に返されたときにのみアクティブになります(最初にユーザーを取得したユーザー内のイベントをキャッチします)。

私はすでにこれについて検索しましたが、私が望むような形で行われた結果はほとんど見つかりませんでした(ほとんどフォーム、一般的なシリアライズなど)。

私が持っていた唯一のアイデアは、イベントエンティティにメソッドを追加することでした。例えば、getSimple手動でいくつかのパラメータを設定して、外に出す(ただし、接続されたすべてのものに対してもそうする必要があります)。これはかなり汚れているように見えたので、私はここで尋ねています。

TL; DR

は私が

[ 
    {"id":1, "name":"foo", "users":[ 
    {"id":1, "name":hans"}, 
    {"id":2, "name":"jack"},... 
    ]},... 
] 

ような何かをしたいが、私が正しく理解していれば、私は(あなたがeventsプロパティを除外したい、

[ 
    {"id":1, "name":"foo", "users":[ 
    {"id":1, "name":hans", "events":[1,{"id":3, "name":"this hasnt already been shown"}], "userfield":"var", "anotheruserfield":"bar", "someOtherRelation":{"bla"}, 
    {"id":2, "name":"jack", "events":[1,{"id":3, "name":"this hasnt already been shown"}], "userfield":"var", "anotheruserfield":"bar", "someOtherRelation":{"bla"}},... 
    ]},... 
] 

答えて

0

はい、JMSSerializerはこれを解決する可能性のある方法と他の方法を提供しますが、私は何か違うものを決めました:EventNormalizerというカスタムを書くことは、まさに私が望むものであり、

$encoder = new JsonEncoder(); 
$normalizer = new \AppBundle\Serializer\Normalizer\EventNormalizer(); 

$serializer = new Serializer([$normalizer], [$encoder]); 
$serialized = $serializer->serialize($events, 'json'); 

そして、正規化

namespace AppBundle\Serializer\Normalizer; 

use Symfony\Component\Serializer\Normalizer\NormalizerInterface; 

/** 
* Event normalizer 
*/ 
class EventNormalizer implements NormalizerInterface 
{ 

     /** 
     * {@inheritdoc} 
     */ 
     public function normalize($object, $format = null, array $context = array()) 
     { 
       $result = /* using fields from $object */ 

       return $result; 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function supportsNormalization($data, $format = null) 
     { 
       return $data instanceof \AppBundle\Entity\Event; 
     } 
} 
0

のようなものを取得し、多分あなたのオブジェクトのシリアライゼーションから)。

JMSSerializerは、プロパティを除外/公開したり、その深度を制限することができるため、ニーズに合ったものになります。

このバンドルは、SymfonyのドキュメントのSerialization chapterの最後に記載されています。

exclusion strategiesとその@Exclude@Expose@Groups@MaxDepth注釈を参照してください。

+0

はい、除外は私が探してきた言葉です!はい、これは私の質問を解決することができるかもしれませんが、私はイベントから来たときにはあまりにも多くのため、ユーザーに「除外」と注釈を付ける気がします。だから私はカスタムノーマライザ – kero

関連する問題