Internal GraphQL Server
Это расширение устанавливает внутренний GraphQL Server, который можно вызывать внутри вашего приложения с помощью PHP-кода.
Среди прочих сценариев использования вы можете запускать выполнение GraphQL query при наступлении определённого события, чтобы выполнить связанную задачу (например, отправить уведомление, добавить запись в лог, проверить условие и т. д.).
Описание
Доступ к внутреннему GraphQL Server осуществляется через класс GatoGraphQL\InternalGraphQLServer\GraphQLServer посредством следующих трёх методов:
executeQuery: Выполнить GraphQL queryexecuteQueryInFile: Выполнить GraphQL query, содержащийся в файле (.gql)executePersistedQuery: Выполнить persisted GraphQL query (передав его ID в виде int или slug в виде строки) (требуется расширение Persisted Queries)
Ниже приведены сигнатуры методов:
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 {
// ...
}
}Чтобы выполнить GraphQL query и получить содержимое ответа:
// 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"] ?? [];Объект Response также содержит все сгенерированные заголовки (например, если была применена Cache Control List, будет добавлен заголовок Cache-Control):
$responseHeaders = $response->getHeaders();
$responseCacheControlHeader = $response->getHeaderLine('Cache-Control');Обратите внимание, что класс GraphQLServer не готов к использованию до срабатывания хука init ядра WordPress.
Конфигурация схемы
Внутренний GraphQL Server применяет собственную конфигурацию схемы. Например, конфигурация по умолчанию выбирается на странице настроек во вкладке «Internal GraphQL Server».

Эта конфигурация применяется и в тех случаях, когда query, выполняемый на внутреннем GraphQL Server, был инициирован другим GraphQL query, который разрешался на endpoint'е с иной конфигурацией (например, на публичном endpoint'е graphql/).
Для наглядности предположим, что мы настроили единственный endpoint graphql/ на применение списка контроля доступа для проверки пользователей по IP-адресу, и выполняем мутацию createPost против этого endpoint'а:
mutation {
createPost(input: {...}) {
# ...
}
}Таким образом, выполнить эту мутацию смогут только посетители с указанного IP-адреса.
Далее, существует хук на publish_post, который выполняет определённый query на внутреннем GraphQL Server (например, для отправки уведомления администратору сайта):
add_action(
"publish_post",
fn (int $post_id) => GraphQLServer::executeQuery("...", ["postID" => $post_id])
);Этот GraphQL query будет разрешён с использованием конфигурации схемы, применённой к внутреннему GraphQL Server, а не к единственному endpoint'у graphql/.
В результате проверка по IP-адресу пользователя выполняться не будет (если только этот список контроля доступа не был также применён к внутреннему GraphQL Server).
Отладка проблем
Для отслеживания выполнения query можно просматривать логи.
Подробнее см. в разделе Устранение неполадок.
Пример
В этом примере рабочего процесса (также использующем модули Multiple Query Execution, Helper Function Collection и Field to Input) при создании новой записи на сайте мы отправляем уведомление пользователю-администратору.
Мы подключаемся к действию ядра WordPress new_to_publish, извлекаем данные из только что созданной записи и вызываем GraphQLServer::executeQuery:
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');
}
);...с таким 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
}
}