2017-05-10 1 views
0

-je obtenir les données de demande http sous forme donnéeSymfony3 sérialiseur - Comment séparer les valeurs de chaînes de points et se combinent dans une colonne de tableau

{ 
    "start_date": "2017-03-13", 
    "end_date": "2017-03-19", 
    "visitors_total": 2555, 
    "views_total": 2553, 
    "visitors_country.france": 100, 
    "visitors_country.germany": 532, 
    "visitors_country.poland": 32, 
    "views_country.france": 110, 
    "views_country.germany": 821, 
    "views_country.poland": 312, 
} 
entité doctrine

defination pour les colonnes

"start_date" => datetime 
"end_date" => datetime 
"visitors_total" => int 
"views_total" => int 
"visitors_country" => array 
"views_country => array 

Pour le visitors_country et views_country, les clés/valeurs du tableau sont séparées par des points. Ces valeurs

séparés par des points
"views_country.france": 110, 
"views_country.germany": 821, 
"views_country.poland": 312, 

qui devraient être

'view_country' => array(
    'france'=> 110, 
    'germany'=> 821, 
    'poland'=> 312, 
); 

J'utilise Symfony sérialisation composant pour la sérialisation des données demandées et ayant problème dénormaliser les données.

je fait quelque chose comme ça

class ArrayDotNormalizer implements DenormalizerInterface 
{ 

    /** 
    * {@inheritdoc} 
    * 

    */ 
    public function denormalize($data, $class, $format = null, array $context = array()) 
    { 
    // Actually, this function applies to each column of requested data , 
    //but how to separate values by dot and join them in one array and store as array json in db ? 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function supportsDenormalization($data, $type, $format = null) 
    { 

     return strpos($data, '.') !== false; 
    } 

} 

Toute idée de résoudre ce problème?

+0

Les données de http est JSON? Si c'est le cas, alors décoder json retournera array et ensuite essayer d'utiliser l'option explode avec (dot) pour faire comme structure de tableau désirée –

Répondre

0

Essayez avec ceci:

class ArrayDotNormalizer extends ObjectNormalizer 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = []) 
    { 
     if (strpos($attribute, '.') !== false) { 
      list($attribute, $country) = explode('.', $attribute); 
      $currentValue = (array) $this->propertyAccessor->getValue($object, $attribute); 
      $value = array_replace($currentValue, [$country => $value]); 
     } 

     return parent::setAttributeValue($object, $attribute, $value, $format, $context); 
    } 
} 

et utiliser ce normalisateur dans votre sérialiseur:

$serializer = new Serializer([new ArrayDotNormalizer()], [new JsonEncoder()]); 

Résultat:

enter image description here