Les mutations GraphQL

Les mutations GraphQL

22 octobre 2021

Les mutations nous sont nécessaires si nous voulons enregistrer des données. Les mutations prennent en charge un type de données en entrée et nous retournerons un objet.

Dans le dossier config/graphql/types, ajoutez le fichier Mutation.yaml :

Mutation:
    type: object
    config:
        fields:
            createArtist:
                type: ArtistPayLoad
                resolve: "@=mutation('createArtist', [args])"
                args:
                    firstname:
                        type: String!

ArtistPayLoad:
    type: object
    config:
        fields:
            content:
                type: Artist!

Nous allons devoir configurer notre bundle pour définir le endpoint de nos mutations.
Ouvrez et modifiez le fichier config/packages/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: null

Ajouter la ligne mutation: Mutation dans le schema et auto_discover: false dans le mappings.

Resolvers de mutations

Maintenant que notre mutation est prête, nous allons avoir besoin de resolvers pour les utiliser.

Dans le dossier src/GraphQL, créez le dossier Mutation et ajoutez le fichier ArtistMutation.php :

<?php

namespace App\GraphQL\Mutation;

use Doctrine\ORM\EntityManagerInterface;
use Overblog\GraphQLBundle\Definition\Argument;
use Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface;
use Overblog\GraphQLBundle\Definition\Resolver\MutationInterface;
use App\Entity\Artist;

class ArtistMutation implements MutationInterface, AliasedInterface
{
    private EntityManagerInterface $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function resolve(Argument $args)
    {
        $artist = (new Artist())->setFirstname($args['firstname']);

        $this->em->persist($artist);
        $this->em->flush();

        return ['content' => $artist];
    }

    /**
     * {@inheritdoc}
     */
    public static function getAliases(): array
    {
        return [
            'resolve' => 'createArtist',
        ];
    }
}

Pour terminer, nous devons le configurer dans les services de Symfony pour l'utiliser. Ouvrez le fichier config/services.yaml :

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

Testons notre code. Dans GraphiQL, insérez le code suivant :

mutation createArtist {
  createArtist(firstname: "John") {
    content{
      id
      firstname
      albums {
        id
      }
    } 
  }
}

Le résultat devra correspondre à quelque chose comme celui-ci :

{
  "data": {
    "createArtist": {
      "content": {
        "id": 35,
        "firstname": "John",
        "albums": []
      }
    }
  }
}

Vérifiez votre base de données, vous devriez retrouver votre nouvel artiste.