Convertir un tableau en objet avec le sérialiseur Symfony

Publié le 13/04/2023 • Actualisé le 13/04/2023


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment convertir un tableau en objet avec le sérialiseur Symfony. C'est un besoin commun que de transformer un tableau en objet. Je ne trouve pas la documentation limpide à ce sujet. On doit utiliser le service serializer qui est déjà configuré pour les cas les plus courants.
Une chose un peu étrange à première vue est que l'on récupère le sérialiseur grâce à l'interface Symfony\Component\Serializer\SerializerInterface, mais si l'on regarde le contrat, la fonction denormalize() n'existe pas. Celle-ci est présente dans la classe Symfony\Component\Serializer\Serializer. C'est pourquoi j'annote la propriété avec l'expression SerializerInterface&Serializer ce qui indique que l'objet est simultanément un SerializerInterface et un Serializer.
Avec les paramètres par défaut, le sérialiseur peut convertir un objet avec des accesseurs et un objet avec les propriétés publiques.
Dans le premier exemple, la classe ValueObject a les accesseurs getFoo() et setFoo().
Dans le second exemple, la classe ValueObjectPublicProperties a une propriété publique foo.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use App\Dto\ValueObject;
use App\Dto\ValueObjectPublicProperties;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property SerializerInterface&Serializer $serializer
 */
trait Snippet251Trait
{
    public function snippet251(): void
    {
        $array = [
            'foo' => 'bar',
        ];

        $dto = $this->serializer->denormalize($array, ValueObject::class);
        $dto2 = $this->serializer->denormalize($array, ValueObjectPublicProperties::class);

        var_dump($dto);
        var_dump($dto2);

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Plus sur le web  Snippet aléatoire

  Travaillez avec moi !