Convertir un tableau en objet avec le sérialiseur Symfony
Publié le 13/04/2023 • Actualisé le 13/04/2023
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