La désérialisation est le fonctionnement inverse à celui que l'on a vu précédemment. L'objectif est de convertir les données fournies dans un certain format dans un objet de notre application.
public function index(
Request $request,
SerializerInterface $serializer
): Response
{
$recipe = $serializer->deserialize($request->getContent(), Recipe::class, 'json')
}
Le fonctionnement est similaire à celui que l'on a vu pour le Serializer (on peut utiliser les groupes pour définir les champs à sérialiser).
MapRequestPayload
Il existe un raccourci permettant de gérer la sérialisation d'une requête dès les arguments du Controller. Cela se fait à l'aide de l'attribut MapRequestPayload
#[Route("/api/recipes", methods: ["POST"])]
public function create(
Request $request,
#[MapRequestPayload(
serializationContext: [
'groups' => ['recipes.create']
]
)]
Recipe $recipe,
EntityManagerInterface $em
)
{
$recipe->setCreatedAt(new \DateTimeImmutable());
$recipe->setUpdatedAt(new \DateTimeImmutable());
$em->persist($recipe);
$em->flush();
return $this->json($recipe, 200, [], [
'groups' => ['recipes.index', 'recipes.show']
]);
}
Cet attribut va aussi utiliser la validation et si les données soumises ne sont pas valides une erreur sera directement renvoyée à l'utilisateur.
Il existe aussi un équivalent pour générer un objet à partir des informations provenant de l'URL à l'aide de MapQueryString.