2014-04-30 10 views
5

Czy mogę nadpisać sposób serializowania obiektu znacznika? Obecnie wszystko jest zwracane, chciałbym wykluczyć identyfikator, created_at, updated_at i tagging. Im przy użyciu pakietu JMS Serializer, Doctrine Rozszerzenia Taggable z pakietu znaczników FPN.Zastąp metadane serializera dla DoctrineExtensions Taggable

To jest moja konfiguracja, myślę, że ustawienie rodzica pakietu tagów na FPN, gdy przestrzeń nazw Jednostki to faktycznie DoctrineExtensions może być problemem.

Większość parametrów encji znajduje się w DoctrineExtensions \ Taggable \ Entity \ Tag (id, name, created_at etc). Nadpisuję pakiet FPN, który rozszerza DoctrineExtensions. DoctrineExtensions to biblioteka, a nie pakiet.

Jak mogę to zrobić?

# 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

'wystawiać: TRUE (dla właściwości name) nie wydaje się być odpowiednio wcięte. Czy jest to literówka w twoim pytaniu, czy w twoim prawdziwym pliku yaml? –

+0

Można również dodać do jednej z właściwości, aby sprawdzić, czy konfiguracja jest w rzeczywistości używana? 'serialized_name: 'fooBar'' –

+0

Tak, to był literówka, który naprawiłem. Symfony powinno było rzucić na niego błąd analizy, jeśli było źle wcięte. Wkrótce zmienię nazwę serialized_name. – shapeshifter

Odpowiedz

1

JMSSerializer wymaga, aby określić konfigurację serializacji na tej samej przestrzeni nazw, jak to, w którym zostały zadeklarowane właściwości.

Na przykład, powiedzmy, że masz Application\Bundle\AcmeBundle\Entity\BaseModel klasę z $createdAt i $updatedAt właściwości i Application\Bundle\AcmeBundle\Entity\Model klasa dziedziczy klasę BaseModel z właściwością $name. W takim przypadku będziesz potrzebować 2 plików serializacji: jeden o nazwie Entity.BaseModel.xml z konfiguracją serializacji dla właściwości $createdAt i $updatedAt; i jeden o nazwie Entity.Model.xml z konfiguracją dla właściwości $name.

Przekroczono konfigurację dla studni FPNTagBundle, jednak jedynym polem, które można skonfigurować do serializacji w bieżącej konfiguracji, jest pole $slug (zdefiniowane w klasie FPN\TagBundle\Entity\Tag). W przypadku innych pól musisz zastąpić katalogi konfiguracyjne z DoctrineExtensions\Taggable\Entity\Tag.

Twój config powinien wtedy być coś takiego:

# 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 :)