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