2017-01-02 45 views
5

JMS serializer ile ilgili bir sorunum var. Grupları kullandığımda JMS, alt sınıflarımı serileştirmiyor, ancak grupları kullanmadığımda her şey yolunda. Ne yanlış yapıyorum?JMS Serializer, çocuk sınıflarını serileştirmiyor

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

Ver:

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

Ve bu benim sınıflardır. Veli:

/** 
* 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; 

Ve çocuk sınıfı: çocuk sınıfta

/** 
* 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

size yardımcı olacaktır Umut ... ... – Hammerbot

cevap

0

"hiçbiri" @Groups

karıştırıyor

@JMS\ExclusionPolicy("none") 

@JMS\ExclusionPolicy("all") 

için değiştirmeyi deneyin
+0

bu çalıştı ve ne yazık ki hiçbir şey değiştirin:/ –

+1

Eğer ek açıklamalar için bir önbellek kullanıyor veya içinde bulunduğunuz ürün ortamı? denetleyicinizde bir hata var: $$ contextWithoutGroup iki $ –

+0

evet koydu ama bu hata sadece burada yapıldı (ben örnek daha okunabilir yapmak için değişken isimleri değiştirdim) ve% 100 önbellek bir şey değildir. Önbelleği devre dışı bırakıyorum, her zaman önbelleği vb. (ve eminim abotu cache olayı, coz "ebeveyn" sınıflarındaki değişiklikleri görüyorum) –

-1

Bu notu kullanmanız gerektiğini düşünüyorum: "@discriminator" Bunu okuyun! https://jmsyst.com/libs/serializer/master/reference/annotations#discriminator Ben aynı sorunu vardı ve benim en seviyeli abstact tarafı olan sorunumu :) (Üzgünüm, YML unstead açıklamaları kullanır, ancak iş aynıdır) bulundu, burada alan_adı "sınıfAdı" ile ayırt edici olduğu (ve özelliklerinde tanımlandığı!): (yml dosyası: Entity.Bases.Basentity.yml - senin Varlık dizininde ".Bases" veya diğer alt dizinleri unutmayın!)

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 

Şimdi de Varlığımın tanımı (benim Basentity.php'yi genişletir), kendi alanlarını da ekleyebilirsiniz. Sadece bu keşfetti, bu yüzden Birden fazla iki seviye olabilir ...

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

daha söyleyemem, işe yarıyor. Ben temiz bir proje üzerinde sağlanan kodu ile sorunu yeniden olamazdı