Symfony ExpressionLanguage : Comment utiliser ce composant ?
Le composant Symfony ExpressionLanguage : qu'est-ce que c'est ? Quand et comment l'utiliser ? Comment créer des expressions lors de cas plus complexes ?
Progression
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.
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!'
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: ~
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']
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
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.
Auteur(s)
Vincent Composieux
Architecte passionné par les technologies web depuis de longues années, je pratique principalement du PHP (Symfony) / Javascript mais aussi du Python ou Golang.
Vous souhaitez en savoir plus sur le sujet ?
Organisons un échange !
Notre équipe d'experts répond à toutes vos questions.
Nous contacterDécouvrez nos autres contenus dans le même thème
Le composant Symfony ExpressionLanguage : qu'est-ce que c'est ? Quand et comment l'utiliser ? Comment créer des expressions lors de cas plus complexes ?
Découvrez comment réaliser du typage générique en PHP : introduction et définition du concept, conseils et explications pas-à-pas de cas pratique.
Découvrez un cas d'usage d'intégration d'un CRM avec une application e-commerce, en asynchrone, avec Hubspot et RabbitMQ