2016-04-07 13 views
1

Ich versuche, einen einfachen Kalender mit Symfony zu erstellen. Dazu möchte ich die Ereignisse des ausgewählten Monats über AJAX anfordern. Für jedes Ereignis können mehrere Benutzer verbunden sein.Entity für kleinere Ausgabe transformieren

nun das Ereignis Abrufen ist ganz einfach

$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'); 

ich setCircularReferenceHandler benötigt, weil offensichtlich Benutzer die Ereignisse haben auch mit ihnen verbunden sind.

In meinem Test habe ich derzeit nur 2 Ereignisse, aber ich bekomme eine Antwort von ~ 50kb, einfach weil es von den Benutzerobjekten aufgebläht wird. Alles, was ich wirklich will, ist Benutzer-ID und Name, aber es ruft alle anderen Felder (und andere verbundene Entitäten) ab.

Der zirkuläre Referenzhandler selbst wird erst aktiviert, wenn der Benutzer bereits zurückgegeben wurde (und fängt das Ereignis innerhalb des Benutzers ab, der den Benutzer ursprünglich abgerufen hat).

Ich habe bereits darüber gesucht, aber fand kein einziges Ergebnis, das in der Art und Weise ging, wie ich wollte (die meisten waren über Formulare, allgemeine Serialisierung, etc).

Die einzige Idee, die ich hatte, war, eine Methode zu der Event-Entität hinzuzufügen, zB getSimple, wo ich manuell einige Parameter einstelle und outers auslasse (muss aber auch für alles was angeschlossen ist). Das schien ziemlich unsauber, daher frage ich hier.

TL; DR

Ich möchte so etwas wie

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

aber ich habe so etwas wie

[ 
    {"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"}},... 
    ]},... 
] 

Antwort

0

Ja, JMSSerializer bietet Exclude und andere Methoden, die dieses Problem lösen könnte, aber ich entschied mich für etwas anderes: Schreiben eines benutzerdefinierten EventNormalizer das ist genau das tut, was ich will, und nicht die anderen Einheiten se pro verändern.

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

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

Und die normalizer

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

Wenn ich richtig verstehe, Sie wollen die events Eigenschaft auszuschließen (und vielleicht andere) von Ihrer Objektserialisierung.

Der JMSSerializer würde Ihren Anforderungen entsprechen, da er es ermöglicht, Eigenschaften auszuschließen und/oder deren Tiefe zu begrenzen.

Das Bündel wird am Ende der Serialization chapter der Symfony-Dokumentation erwähnt.

Siehe exclusion strategies und seine @Exclude, @Expose, @Groups und @MaxDepth Anmerkungen.

+0

Ja, Ausschluss ist das Wort, das ich schon immer gesucht haben! Während ja, kann das meine Frage vielleicht lösen, ich möchte den User mit 'Exclude' kommentieren, nur weil ich von einem Event zu viel komme. Deshalb ging ich mit einem benutzerdefinierten Normalizer – kero