2017-08-28 1 views
0

Je recherche un moyen d'inclure des champs dynamiques lors de la sortie de données JSON via le sérialiseur JMS. Et j'ai trouvé le post ici: https://jolicode.com/blog/how-to-implement-your-own-fields-inclusion-rules-with-jms-serializerRègles d'inclusion de champs dans JMS Serializer

La solution ici est d'inclure/exclure les champs actuels de l'entité actuelle. Mais je veux aussi que les sous-entités définissent les champs lorsque l'entité a des relations un-à-plusieurs. Par exemple:

class User 
{ 
    private $name; 
    private $age; 

    /**@Type("array<Book>")**/ 
    var $books = []; 
} 

class Book 
{ 
    private $title; 
    private $pages; 
    private $content; 
} 

Pour que je puisse passer un tableau à la FieldsListExclusionStrategy de comprendre qu'il les données ici:

$fields = [ 
    'User' => ['name'], 
    'Book' => ['title'], 
]; 

Mais pas seulement id et title pour l'entité actuelle. Quelqu'un sait comment ça?

Répondre

0

Em ... Enfin, je suis le code (similaire à la poste):

class FieldsListExclusionStrategy implements \JMS\Serializer\Exclusion\ExclusionStrategyInterface 
{ 
    private $fields = []; 

    public function __construct(array $fields = []) 
    { 
     $this->fields = $fields; 
    } 

    public function shouldSkipClass(\JMS\Serializer\Metadata\ClassMetadata $metadata, \JMS\Serializer\Context $context) 
    { 
     return false; 
    } 

    public function shouldSkipProperty(\JMS\Serializer\Metadata\PropertyMetadata $property, \JMS\Serializer\Context $context) 
    { 
     $class = $property->class; 
     if (!isset($this->fields[$class])) return false; 

     $fields = $this->fields[$class]; 
     $name = $property->serializedName ?: $property->name; 
     return !in_array($name, $fields); 
    } 
}