Internal GraphQL Server
Deze extensie installeert een interne GraphQL-server, die binnen je applicatie kan worden aangeroepen via PHP-code.
Je kunt onder andere de uitvoering van een GraphQL query activeren wanneer er een actie plaatsvindt, om een bijbehorende taak uit te voeren (zoals het versturen van een notificatie, het toevoegen van een logvermelding, het valideren van een voorwaarde, enz.).
Beschrijving
De interne GraphQL-server is toegankelijk via de klasse GatoGraphQL\InternalGraphQLServer\GraphQLServer, via deze drie methoden:
executeQuery: Voer een GraphQL query uitexecuteQueryInFile: Voer een GraphQL query uit die is opgeslagen in een (.gql)-bestandexecutePersistedQuery: Voer een opgeslagen GraphQL query uit (door het ID op te geven als int, of de slug als string) (de extensie Persisted Queries is vereist)
Dit zijn de methode-signaturen:
namespace GatoGraphQL\InternalGraphQLServer;
use PoP\Root\HttpFoundation\Response;
class GraphQLServer {
/**
* Execute a GraphQL query
*/
public static function executeQuery(
string $query,
array $variables = [],
?string $operationName = null,
int|string|null $schemaConfigurationIDOrSlug = null,
): Response {
// ...
}
/**
* Execute a GraphQL query contained in a (`.gql`) file
*/
public static function executeQueryInFile(
string $file,
array $variables = [],
?string $operationName = null,
int|string|null $schemaConfigurationIDOrSlug = null,
): Response {
// ...
}
/**
* Execute a persisted GraphQL query (providing its object
* of type WP_Post, ID as an int, or slug as a string)
*/
public static function executePersistedQuery(
WP_Post|string|int $persistedQuery,
array $variables = [],
?string $operationName = null
): Response {
// ...
}
}Om een GraphQL query uit te voeren en de inhoud van het antwoord te verkrijgen:
// Provide the GraphQL query
$query = "{ ... }";
// Execute the query against the internal server
$response = GraphQLServer::executeQuery($query);
// Get the content and decode it
$responseContent = json_decode($response->getContent(), true);
// Access the data and errors from the response
$responseData = $responseContent["data"] ?? [];
$responseErrors = $responseContent["errors"] ?? [];Het Response-object bevat ook alle gegenereerde headers (bijv. als er een Cache Control List is toegepast, wordt de Cache-Control-header toegevoegd):
$responseHeaders = $response->getHeaders();
$responseCacheControlHeader = $response->getHeaderLine('Cache-Control');Houd er rekening mee dat de klasse GraphQLServer niet beschikbaar is vóór de WordPress core init-hook.
Schemaconfiguratie
De interne GraphQL-server past zijn eigen schemaconfiguratie toe. De standaardconfiguratie wordt bijvoorbeeld geselecteerd op de instellingenpagina, onder het tabblad "Internal GraphQL Server".

Deze configuratie is ook van toepassing wanneer de query die wordt uitgevoerd tegen de interne GraphQL-server is geactiveerd door een andere GraphQL query tijdens de verwerking in een endpoint met een andere configuratie (zoals het publieke endpoint graphql/).
Ter illustratie: stel dat we het enkelvoudige endpoint graphql/ hebben geconfigureerd om een Access Control List toe te passen voor gebruikersvalidatie op IP, en we voeren de mutatie createPost uit tegen dit endpoint:
mutation {
createPost(input: {...}) {
# ...
}
}Hierdoor kunnen alleen bezoekers van dat IP-adres deze mutatie uitvoeren.
Dan is er een hook op publish_post die een query uitvoert tegen de interne GraphQL-server (bijv. om een notificatie te sturen naar de sitebeheerder):
add_action(
"publish_post",
fn (int $post_id) => GraphQLServer::executeQuery("...", ["postID" => $post_id])
);Deze GraphQL query wordt opgelost met de schemaconfiguratie die is toegepast op de interne GraphQL-server, en niet op het enkelvoudige endpoint graphql/.
Als gevolg hiervan vindt de validatie op gebruikers-IP niet plaats (tenzij die Access Control List ook is toegepast op de interne GraphQL-server).
Problemen debuggen
Om de uitvoering van de query bij te houden, kun je de logs bekijken.
Bekijk Problemen oplossen voor meer details.
Voorbeeld
In dit voorbeeldworkflow (dat ook gebruikmaakt van de modules Multiple Query Execution, Helper Function Collection en Field to Input) sturen we een notificatie naar de beheerder wanneer er een nieuw bericht op de site wordt aangemaakt.
We haken in op de WordPress core-actie new_to_publish, halen de gegevens op van het nieuw aangemaakte bericht en roepen GraphQLServer::executeQuery aan:
add_action(
'new_to_publish',
function (WP_Post $post) {
if ($post->post_type !== 'post') {
return;
}
// Check the contents of the query below
$query = ' ... ';
$variables = [
'postTitle' => $post->post_title,
'postContent' => $post->post_content,
]
GraphQLServer::executeQuery($query, $variables, 'SendEmail');
}
);...met deze GraphQL query:
query GetEmailData(
$postTitle: String!,
$postContent: String!
) {
emailMessageTemplate: _strConvertMarkdownToHTML(
text: """
There is a new post on the site:
**{$postTitle}**:
{$postContent}
"""
)
emailMessage: _strReplaceMultiple(
search: ["{$postTitle}", "{$postContent}"],
replaceWith: [$postTitle, $postContent],
in: $__emailMessageTemplate
)
@export(as: "emailMessage")
}
mutation SendEmail @depends(on: "GetEmailData") {
_sendEmail(
input: {
to: "admin@site.com"
subject: "There is a new post"
messageAs: {
html: $emailMessage
}
}
) {
status
}
}