2014-04-30 4 views
5

태그 객체의 직렬화 방식을 덮어 쓸 수 있습니까? 현재 모든 것이 반환됩니다. id, created_at, updated_at 및 태그를 제외하고 싶습니다. IM은 JMS Serializer 번들, Doctrine Extension Taggable과 FPN Tag 번들을 사용합니다.DoctrineExtensions Taggable의 serializer 메타 데이터 덮어 쓰기

이것은 내 설정입니다. 엔티티의 네임 스페이스가 실제로 DoctrineExtensions가 문제 일 수있는 경우 태그 번들의 ​​부모를 FPN으로 설정하는 것이 좋습니다.

대부분 엔티티 매개 변수는 DoctrineExtensions \ Taggable \ Entity \ Tag (id, name, created_at 등)에 있습니다. DoctrineExtensions를 확장 한 FPN 번들을 덮어 쓰고 있습니다. DoctrineExtensions는 번들이 아닌 라이브러리입니다.

어떻게하면됩니까?

# 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

는'노출 : TRUE '(이름 속성)가 제대로 들여 쓰기를하지 않는 것

귀하의 설정 사항은 다음과 같이해야한다. 귀하의 질문이나 실제 yaml 파일에 오타가 있습니까? –

+0

또한 속성 중 하나에 다음을 추가하여 구성이 실제로 사용되고 있는지 확인할 수 있습니까? 'serialized_name : 'fooBar'' –

+0

그래, 그 말은 오타 였어. Symfony가 잘못 들여 쓰기를했다면 yaml 구문 오류가 발생했습니다. 나는 serialized_name을 곧 바꿀 것이다. – shapeshifter

답변

1

JMSSerializer는 속성이 선언 된 것과 같은 네임 스페이스에 직렬화 구성을 정의해야합니다.

예를 들어, 당신이 $createdAt$updatedAt 특성을 가진 Application\Bundle\AcmeBundle\Entity\BaseModel 클래스 및 $name 특성으로 BaseModel 클래스를 상속 Application\Bundle\AcmeBundle\Entity\Model 클래스가 있다고 가정 해 보자. 이 경우 두 개의 직렬화 파일이 필요합니다 : Entity.BaseModel.xml의 이름은 $createdAt$updatedAt 속성에 대한 직렬화 구성입니다. 하나는 이고 $name 속성의 구성입니다.

FPNTagBundle의 구성을 잘 overrode하지만 현재 구성을 사용하여 직렬화를 구성 할 수있는 유일한 필드는 $slug 필드 (FPN\TagBundle\Entity\Tag 클래스에 정의 됨)입니다. 다른 필드의 경우 DoctrineExtensions\Taggable\Entity\Tag의 구성 디렉토리를 대체해야합니다.

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