Désérialisation et MapRequestPayload

Voir la vidéo
Description Sommaire

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.

Publié
Technologies utilisées
Auteur :
Grafikart
Partager