Internal GraphQL Server
Diese Erweiterung installiert einen internen GraphQL Server, der innerhalb deiner Anwendung per PHP-Code aufgerufen werden kann.
Unter anderem kannst du die Ausführung einer GraphQL query auslösen, wann immer eine Aktion stattfindet, um eine damit verbundene Aufgabe auszuführen (z. B. eine Benachrichtigung senden, einen Log-Eintrag hinzufügen, eine Bedingung validieren usw.).
Beschreibung
Der interne GraphQL Server ist über die Klasse GatoGraphQL\InternalGraphQLServer\GraphQLServer zugänglich, mit diesen drei Methoden:
executeQuery: Führt eine GraphQL query ausexecuteQueryInFile: Führt eine GraphQL query aus, die in einer (.gql)-Datei enthalten istexecutePersistedQuery: Führt eine persisted GraphQL query aus (mit ihrer ID als int oder ihrem Slug als string) (die Erweiterung Persisted Queries ist erforderlich)
Dies sind die Methodensignaturen:
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 {
// ...
}
}Um eine GraphQL query auszuführen und den Inhalt der Antwort zu erhalten:
// 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"] ?? [];Das Response-Objekt enthält auch alle erzeugten Header (z. B.: wenn eine Cache Control List angewendet wurde, würde der Cache-Control-Header hinzugefügt):
$responseHeaders = $response->getHeaders();
$responseCacheControlHeader = $response->getHeaderLine('Cache-Control');Beachte, dass die Klasse GraphQLServer nicht bereit ist, bevor der WordPress-Core-Hook init ausgeführt wurde.
Schema-Konfiguration
Der Internal GraphQL Server wendet seine eigene Schema-Konfiguration an. Die Standardkonfiguration wird beispielsweise auf der Einstellungsseite unter dem Tab „Internal GraphQL Server" ausgewählt.

Diese Konfiguration gilt auch dann, wenn die gegen den Internal GraphQL Server ausgeführte query durch eine andere GraphQL query ausgelöst wurde, während diese in einem Endpoint mit einer anderen Konfiguration aufgelöst wurde (z. B. dem öffentlichen Endpoint graphql/).
Zur Veranschaulichung: Angenommen, wir haben den Single Endpoint graphql/ so konfiguriert, dass eine Access Control List zur Validierung von Benutzern per IP angewendet wird, und wir führen die Mutation createPost gegen diesen Endpoint aus:
mutation {
createPost(input: {...}) {
# ...
}
}Damit können nur Besucher von dieser IP diese Mutation ausführen.
Dann gibt es einen Hook auf publish_post, der eine query gegen den Internal GraphQL Server ausführt (z. B.: um eine Benachrichtigung an den Website-Administrator zu senden):
add_action(
"publish_post",
fn (int $post_id) => GraphQLServer::executeQuery("...", ["postID" => $post_id])
);Diese GraphQL query wird mit der Schema-Konfiguration aufgelöst, die auf den Internal GraphQL Server angewendet wird, nicht auf den Single Endpoint graphql/.
Infolgedessen findet die Validierung per Benutzer-IP nicht statt (es sei denn, diese Access Control List wurde auch auf den Internal GraphQL Server angewendet).
Probleme debuggen
Um die Ausführung der query nachzuverfolgen, können wir die Logs einsehen.
Siehe Probleme beheben für weitere Details.
Beispiel
In diesem Beispiel-Workflow (der auch die Module Multiple Query Execution, Helper Function Collection und Field to Input verwendet) senden wir eine Benachrichtigung an den Administrator-Benutzer, wenn ein neuer Beitrag auf der Website erstellt wird.
Wir hängen uns in die WordPress-Core-Aktion new_to_publish ein, rufen die Daten des neu erstellten Beitrags ab und rufen GraphQLServer::executeQuery auf:
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');
}
);...mit dieser 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
}
}