Désérialisation et MapRequestPayload

Résumé Support

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.