Retour

GraphQL avec Symfony

Tuto
28 mars 2018
39mn

Création d'un type mutation

Comme pour la query, nous devons définir les mutations possibles. Il s'agit là aussi d'une fonction prenant en entrée un type input et qui renvoie un objet.

Type Input

Pour ce tutoriel nous allons seulement créer un nouvel astronaute. Nous avons donc besoin d'un seul type input pour l'astronaute.

Dans le dossier config/graphql/types vous devez ajouter un fichier AstronautInput.yaml qui contient :

AstronautInput: type: input-object config: fields: pseudo: type: 'String!'

Ajout de la mutation

Dans le dossier config/graphql/types vous devez ajouter un fichier Mutation.yaml qui contient :

MutationSuccess: type: object config: fields: content: type: String! Mutation: type: object config: fields: NewAstronaut: type: MutationSuccess resolve: "@=mutation('NewAstronaut', [args['input']['pseudo']])" args: input: type: AstronautInput!

Puis dans la configuration du bundle vous devez definir le point d'entrée du type mutation. Dans le fichier `config/graphql.yaml`` :

overblog_graphql: definitions: schema: query: Query mutation: Mutation mappings: auto_discover: false types: - type: yaml dir: "%kernel.project_dir%/config/graphql/types" suffix: ~

Resolver de mutation

Comme pour les resolvers de query, il s'agit d'un service qui implémente les interfaces MutationInterface, AliasedInterface.

Créez le dossier src/Mutation et ajouter le fichier AstronautMutation.php avec ceci :

<?php namespace App\Mutation; use Doctrine\ORM\EntityManagerInterface; use Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface; use Overblog\GraphQLBundle\Definition\Resolver\MutationInterface; use App\Entity\Astronaut; final class AstronautMutation implements MutationInterface, AliasedInterface { private $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function resolve(string $pseudo) { $astronaute = new Astronaut(); $astronaute->setPseudo($pseudo); $this->em->persist($astronaute); $this->em->flush(); return ['content' => 'ok']; } /** * {@inheritdoc} */ public static function getAliases(): array { return [ 'resolve' => 'NewAstronaut', ]; } }

Il ne vous reste plus qu'à configurer le service. Dans le fichier config/services.yaml :

App\Mutation\: resource: '../src/Mutation' tags: ['overblog_graphql.mutation']

Testons

Dans GraphiQL vous pouvez mettre la query suivante :

mutation NewAstronaut($astronaute: AstronautInput!) { NewAstronaut(input: $astronaute) { content } }

Puis dans query variables en bas à gauche :

{ "astronaute": { "pseudo": "test" } }

Si tout est ok pour devriez avoir cela comme réponse :

{ "data": { "NewAstronaut": { "content": "ok" } } }

Retrouvez le code directement ici

Conclusion

Je vous invite à lire la documentation de GraphQL et du bundle https://github.com/overblog/GraphQLBundle/ pour voir l'ensemble des fonctionnalités disponibles dans GraphQL.


Articles sur le même thème

Comment créer de la dette technique dès le début d’un nouveau projet ?

Quand on arrive sur un projet existant, on doit souvent subir une dette technique qui nous fait perdre du temps et qui nous rend fou au point de vérifier qui a fait le code. Vous aussi vous voulez entrer dans la postérité lors d’un git blame et mal concevoir votre produit ?

9 août 20238mnMarianne Joseph-Géhannin

Découvrez Eleven Labs

Notre site pour mieux nous connaître

J'y vais

Contact

Eleven Labs - Paris

102, rue du Faubourg Saint Honoré

75008 Paris

Eleven Labs - Nantes

42, rue la Tour d'Auvergne

44200 Nantes

Eleven Labs - Montréal

1155, Metcalfe St Suite 1500

Montréal, QC H3B 2V6, Canada

business@eleven-labs.com

01.82.83.11.75