Automatisation
AutomatisationAction de Résolution de Requête

Action de Résolution de Requête

Lorsque le serveur GraphQL résout une requête, il déclenche les action hooks suivants avec la réponse GraphQL :

  1. gatographql__executed_query:{$operationName} (uniquement si l'opération GraphQL à exécuter a été fournie)
  2. gatographql__executed_query

Les action hooks qui sont déclenchés sont :

// Triggered only if the GraphQL operation to execute was provided
do_action(
  "gatographql__executed_query:{$operationName}",
  $response,
  $isInternalExecution,
  $query,
  $variables,
);
 
// Triggered always
do_action(
  'gatographql__executed_query',
  $response,
  $isInternalExecution,
  $operationName,
  $query,
  $variables,
);

Les paramètres passés sont :

  • $response : Un objet de la classe PoP\Root\HttpFoundation\Response, contenant la réponse GraphQL (y compris le contenu et les en-têtes)
  • $isInternalExecution : true si la requête a été exécutée via le Internal GraphQL Server (par exemple : via la classe GatoGraphQL\InternalGraphQLServer\GraphQLServer), ou false sinon (par exemple : via l'endpoint unique)
  • $operationName : Opération GraphQL exécutée (uniquement pour le deuxième action hook ; dans le premier, elle est implicite dans le nom du hook)
  • $query : Requête GraphQL exécutée
  • $variables : Variables GraphQL fournies

Exemples

Grâce au Internal GraphQL Server, nous pouvons réagir à la résolution d'une requête GraphQL (qu'elle soit exécutée contre le Internal GraphQL Server, l'endpoint unique, un endpoint personnalisé ou une persisted query), et exécuter une autre requête GraphQL contre le Internal GraphQL Server.

Un exemple de flux de travail est :

  • Se brancher à l'exécution d'une requête GraphQL, par exemple par son nom d'opération (comme CreatePost)
  • Envoyer une notification à l'administrateur, en exécutant la mutation _sendEmail via GatoGraphQL\InternalGraphQLServer\GraphQLServer::executeQuery

Ce code PHP enchaîne 2 exécutions de requêtes GraphQL :

GraphQLServer::executeQuery(
  <<<GRAPHQL
    mutation CreatePost(
      \$postTitle: String!,
      \$postContent: String!
    ) {
      createPost(input: {
        title: \$postTitle
        contentAs: { html: \$postContent }
      }) {
        status
        errors {
          __typename
          ...on ErrorPayload {
            message
          }
        }
        postID
      }
    }
  GRAPHQL,
  [
    'postTitle' => 'New post',
    'postContent' => 'Some content',
  ],
  'CreatePost'
);
 
add_action(
  "gatographql__executed_query:CreatePost",
  function (Response $response) {
    /** @var string */
    $responseContent = $response->getContent();
    /** @var array<string,mixed> */
    $responseJSON = json_decode($responseContent, true);
    $postID = $responseJSON['data']['createPost']['postID'] ?? null;
    if ($postID === null) {
      // Do nothing
      return;
    }
 
    $post = get_post($postID);
 
    // Execute the chained query!
    GraphQLServer::executeQuery(
      <<<GRAPHQL
        mutation SendEmail(
          \$emailSubject: String!
          \$emailMessage: String!
        ) {
          _sendEmail(
            input: {
              to: "admin@site.com"
              subject: \$emailSubject
              messageAs: {
                html: \$emailMessage
              }
            }
          ) {
            status
          }
        }
      GRAPHQL,
      [
        'emailSubject' => sprintf(__("New post: %s"), $post->post_title),
        'emailMessage' => $post->post_content,
      ]
    );
  }
);