2014-04-30 8 views
5

Kann ich die Art und Weise überschreiben, wie das Tag-Objekt serialisiert wird? Derzeit wird alles zurückgegeben, ich möchte die ID, created_at, updated_at und tagging ausschließen. Ich verwende das JMS Serializer Bundle, Doctrine Extensions Taggable mit FPN Tag Bundle.Überschreiben Sie Serializer-Metadaten für DoctrineExtensions Taggable

Das ist mein Setup, ich denke, die Eltern des Tag Bundle zu FPN setzen, wenn der Namespace der Entität DoctrineExtensions tatsächlich das Problem sein könnte.

Die meisten Entitätsparameter befinden sich in DoctrineExtensions \ Taggable \ Entity \ Tag (ID, Name, Erstelldatum usw.). Ich überschreibe das FPN-Paket, das DoctrineExtensions erweitert. DoctrineExtensions ist eine Bibliothek, kein Bündel.

Wie kann ich das tun?

# app/config/config.yml 
# ... 
jms_serializer: 
    metadata: 
     auto_detection: true 
     directories: 
      TagBundle: 
       namespace_prefix: "FPN\\TagBundle" 
       path: "@MYTagBundle/Resources/config/serializer/fpn" 


# MY\TagBundle\Resources\config\serializer\fpn\Entity.Tag.yml 
FPN\TagBundle\Entity\Tag: 
    exclusion_policy: ALL 
    properties: 
     id: 
      expose: false 
     name: 
      expose: true 
     created_at: 
      expose: false 
     updated_at: 
      expose: false 
     tagging: 
      expose: false 


# src/MY/TagBundle/Entity/Tag.php 
<?php 
namespace MY\TagBundle\Entity; 

use FPN\TagBundle\Entity\Tag as BaseTag; 

class Tag extends BaseTag 
{ 
} 


# vendor/fpn/tag-bundle/FPN/TagBundle/Entity/Tag.php 
<?php 

namespace FPN\TagBundle\Entity; 

use DoctrineExtensions\Taggable\Entity\Tag as BaseTag; 

class Tag extends BaseTag 
{ 
    .... 
} 



# src/MY/TagBundle/MYTagBundle.php 
<?php 

namespace MY\TagBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 

class MYTagBundle extends Bundle 
{ 
    // Is this unnecessary due to config.yml? 
    public function getParent() 
    { 
     return 'FPNTagBundle'; 
    } 
} 
+0

'aussetzen: true' (für die Eigenschaft name) scheint nicht richtig eingezogen werden. Ist das ein Tippfehler in Ihrer Frage oder in Ihrer eigentlichen Yaml-Datei? –

+0

Können Sie außerdem einer der Eigenschaften Folgendes hinzufügen, um zu überprüfen, ob die Konfiguration überhaupt verwendet wird? 'serialized_name: 'fooBar'' –

+0

Ja das war ein Tippfehler ich habe es behoben. Symfony hätte einen YAML-Parser-Fehler bei falscher Einrückung ausgeben müssen. Ich werde den serialisierten_namen in Kürze ändern. – shapeshifter

Antwort

1

JMSSerializer erfordert, dass Sie Ihre Serialisierungskonfiguration im selben Namespace definieren, in dem auch die Eigenschaften deklariert sind.

Zum Beispiel: Angenommen, Sie haben eine Application\Bundle\AcmeBundle\Entity\BaseModel Klasse mit $createdAt und $updatedAt Eigenschaften und eine Application\Bundle\AcmeBundle\Entity\Model Klasse der BaseModel-Klasse mit einer $name Eigenschaft vererben. In diesem Fall benötigen Sie 2 Serialisierungsdateien: eine mit der Serialisierungskonfiguration für $createdAt und $updatedAt Eigenschaften Entity.BaseModel.xml; und eine namens Entity.Model.xml mit der Konfiguration für die $name Eigenschaft.

Sie haben die Konfiguration für das FPNTagBundle gut überschrieben, das einzige Feld, das Sie für die Serialisierung mit Ihrer aktuellen Konfiguration konfigurieren können, ist das Feld $slug (das in der Klasse FPN\TagBundle\Entity\Tag definiert ist). Für die anderen Felder müssen Sie die Konfigurationsverzeichnisse von DoctrineExtensions\Taggable\Entity\Tag überschreiben.

Ihre Konfiguration sollte dann so etwas wie dieses:

# app/config/config.yml 
# ... 
jms_serializer: 
    metadata: 
     auto_detection: true 
     directories: 
      TagBundle: 
       namespace_prefix: "FPN\\TagBundle" 
       path: "@MYTagBundle/Resources/config/serializer/fpn" 
      DoctrineTaggable: 
       namespace_prefix: "DoctrineExtensions\\Taggable" 
       path: "@MYTagBundle/Resources/config/serializer/doctrine" 


# MY\TagBundle\Resources\config\serializer\fpn\Entity.Tag.yml 
FPN\TagBundle\Entity\Tag: 
    exclusion_policy: ALL 
    properties: 
     id: 
      expose: false 
     name: 
      expose: true 
     created_at: 
      expose: false 
     updated_at: 
      expose: false 
     tagging: 
      expose: false 
# MY\TagBundle\Resources\config\serializer\fpn\Entity.Tag.yml 
FPN\TagBundle\Entity\Tag: 
    exclusion_policy: ALL 
    properties: 
     slug: 
      expose: false # or true, as you wish :)