Les mutations GraphQL
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.