5

Ich habe ein Problem mit JMS-Serializer. Wenn ich Gruppen verwende, serialisiert JMS meine Kindklassen nicht, aber wenn ich keine Gruppen verwende, ist alles in Ordnung. Was mache ich falsch?JMS Serializer Serialisierung nicht untergeordnete Klassen

$context = SerializationContext::create()->enableMaxDepthChecks(); 
    $context->setGroups(['clientapi']); 

    $contextWithoutGroup = SerializationContext::create()->enableMaxDepthChecks(); 

    /** @var Serializer $serializer */ 
    $serializer = $this->container->get('jms_serializer'); 
    $dataClientApi = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
     $this->getUserFromParam($params), $folder, $categories, $tags 
    ), 'json', $context); 

    $dataWithout = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
     $this->getUserFromParam($params), $folder, $categories, $tags 
    ), 'json', $$contextWithoutGroup); 

Give:

$dataClientApi = '{"0":{"author":{}}}'; 
$dataWithout = '{"0":{"author":{id: 2}}}'; 

und meine Klassen sind. Parent:

/** 
* Document 
* 
* @ORM\Table(name="documents") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\DocumentRepository") 
* @ORM\EntityListeners({"DocumentListener"}) 
* @JMS\ExclusionPolicy("all") 
* @JMS\AccessorOrder("custom", custom = {"id", "folderId", "title"}) 
*/ 
class Document implements ResourceInterface 
{ 

    use Traits\SortableTrait; 
    use Traits\TimestampableTrait; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer", name="id") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\Expose() 
    */ 
    protected $id; 

    /** 
    * @var \AppBundle\Entity\Author 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Author") 
    * @ORM\JoinColumn(name="author_id", nullable=true, referencedColumnName="id") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\MaxDepth(3) 
    * @JMS\Expose() 
    */ 
    protected $author; 

Und Kind Klasse:

/** 
* Author 
* 
* @ORM\Entity 
* @ORM\Table(name="author") 
* @Gedmo\Uploadable(pathMethod="getDirPath", allowOverwrite=false, filenameGenerator="SHA1", appendNumber=true) 
* @JMS\ExclusionPolicy("none") 
* @JMS\AccessorOrder("custom", custom = {"id"}) 
*/ 
class Author implements ResourceInterface, FileInterface 
{ 
    const DIR_PATH = 'web/system/authors'; 

    use Traits\FileTrait; 
    use Traits\TimestampableTrait; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    * @JMS\Groups({"clientapi"}) 
    * @JMS\Expose() 
    */ 
    protected $id; 
+0

ich nicht das Problem mit dem Code reproduzieren könnten Sie auf einem sauberen Projekt zur Verfügung gestellt ... – Hammerbot

Antwort

0

in der Kinderklasse versuchen

Ändern
@JMS\ExclusionPolicy("none") 

zu

@JMS\ExclusionPolicy("all") 

die "none" mit @Groups ist Messing

+0

versucht, dies und nichts leider ändern:/ –

+1

werden Sie einen Cache für Anmerkungen verwenden oder sind Sie in Produktumgebung? Es ist ein Fehler in Ihrem Controller: $$ contextWithoutGroup Sie setzen in zwei $ –

+0

ja, aber dieser Fehler ist nur hier gemacht (ich änderte Variablennamen, um Beispiel lesbarer zu machen) und für 100% ist nicht Cache-Sache. Ich habe Cache deaktivieren, ich lösche immer auch Cache usw., die nichts ändern. (und ich bin sicher, dass ich Cache-Sache abot, ich sehe Veränderungen in "Eltern" -Klassen) –

-1

Ich denke, Sie sollten diese Anmerkung verwenden: "@discriminator" Also lesen Sie dies! Ich hatte das gleiche Problem und fand mein Problem :) (Entschuldigung, ich benutze YML Unstead Anmerkungen, aber der Job ist der gleiche) In meiner Entity least level abstact, hier ist der Diskriminator (und in den Eigenschaften definiert!): (yml Datei: Entity.Bases.Basentity.yml - vergessen Sie nicht ".Bases" oder andere Unterverzeichnisse in Ihrem Entity Verzeichnis!)

AppBundle\Entity\Bases\Basentity: 
exclusion_policy: ALL 
discriminator: 
    field_name: class_name 
    disabled: false 
    map: 
     Basentity: 'AppBundle\Entity\Bases\Basentity' 
     Item: 'AppBundle\Entity\Bases\Item' 
     Tier: 'AppBundle\Entity\Bases\Tier' 
     Atelier: 'AppBundle\Entity\Atelier' 
     Tva: 'AppBundle\Entity\Tva' 
     Language: 'AppBundle\Entity\Language' 
     User: 'UserBundle\Entity\User' 
properties: 
    id: 
     type: integer 
     … 
    class_name: 
     type: string 
     accessor: 
      getter: getShortName 

Jetzt in der Definition meiner Entität (erweitert meine Baseentity.php), Sie können eigene Felder hinzufügen. ich dies gerade entdeckt, so kann mehr nicht sagen ...

AppBundle\Entity\Language: 
exclusion_policy: ALL 
properties: 
    name: 
     type: string 
     groups: ['paged', 'user', 'tva', 'language'] 
    slug: 
     type: string 
     groups: ['paged', 'user', 'tva', 'language'] 
    … 

Sie können mehr als zwei Ebenen haben, es funktioniert. Hoffnung, die Ihnen helfen ...

Verwandte Themen