Internal GraphQL Server
Bu uzantı, PHP kodu kullanarak uygulamanızın içinden çağrılabilen dahili bir GraphQL Server kurar.
Diğer kullanım senaryolarının yanı sıra, bir eylem gerçekleştiğinde ilgili bir görevi yerine getirmek için (bildirim gönderme, log girişi ekleme, koşul doğrulama vb.) bir GraphQL query çalıştırılmasını tetikleyebilirsiniz.
Açıklama
Dahili GraphQL server'a GatoGraphQL\InternalGraphQLServer\GraphQLServer sınıfı aracılığıyla şu üç yöntemle erişilir:
executeQuery: Bir GraphQL query çalıştırırexecuteQueryInFile: Bir (.gql) dosyasında bulunan GraphQL query'yi çalıştırırexecutePersistedQuery: Bir persisted GraphQL query çalıştırır (ID'sini int olarak veya slug'ını string olarak sağlayarak) (Persisted Queries uzantısı gereklidir)
Yöntem imzaları şunlardır:
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 {
// ...
}
}Bir GraphQL query çalıştırmak ve yanıt içeriğini almak için:
// 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 nesnesi aynı zamanda üretilen tüm header'ları da içerir (örneğin: bir Cache Control List uygulandıysa Cache-Control header'ını ekler):
$responseHeaders = $response->getHeaders();
$responseCacheControlHeader = $response->getHeaderLine('Cache-Control');GraphQLServer sınıfının WordPress core init hook'undan önce hazır olmadığını lütfen unutmayın.
Şema Yapılandırması
Dahili GraphQL Server kendi Şema Yapılandırmasını uygular. Örneğin, varsayılan yapılandırma Ayarlar sayfasında "Internal GraphQL Server" sekmesi altında seçilir.

Bu yapılandırma ayrıca, dahili GraphQL server'a karşı çalıştırılan query farklı bir yapılandırmaya sahip bir endpoint'te (örneğin genel graphql/ endpoint'i gibi) çözümlenirken başka bir GraphQL query tarafından tetiklendiğinde de geçerlidir.
Örneklemek gerekirse, tek endpoint'i graphql/'i kullanıcıları IP ile doğrulamak için bir Access Control List uygulayacak şekilde yapılandırdığımızı ve bu endpoint'e karşı createPost mutation'ını çalıştırdığımızı varsayalım:
mutation {
createPost(input: {...}) {
# ...
}
}Bu durumda, yalnızca o IP'den gelen ziyaretçiler bu mutation'ı çalıştırabilecektir.
Ardından publish_post üzerinde dahili GraphQL server'a karşı bir query çalıştıran (örneğin: site yöneticisine bildirim göndermek için) bir hook bulunur:
add_action(
"publish_post",
fn (int $post_id) => GraphQLServer::executeQuery("...", ["postID" => $post_id])
);Bu GraphQL query, tek endpoint graphql/'e değil, dahili GraphQL server'a uygulanan şema yapılandırması kullanılarak çözümlenecektir.
Sonuç olarak, kullanıcı IP doğrulaması gerçekleşmeyecektir (yani, o Access Control List dahili GraphQL server'a da uygulanmadıkça).
Sorunların Hata Ayıklaması
Query'nin çalıştırılmasını takip etmek için loglara göz atabiliriz.
Daha fazla ayrıntı için Sorun Giderme bölümüne bakın.
Örnek
Bu örnek iş akışında (Multiple Query Execution, Helper Function Collection ve Field to Input modüllerini de kullanan), sitede yeni bir gönderi oluşturulduğunda yönetici kullanıcıya bildirim göndeririz.
WordPress core new_to_publish eylemine bağlanır, yeni oluşturulan gönderinin verilerini alır ve GraphQLServer::executeQuery'yi çağırırız:
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');
}
);...şu GraphQL query ile:
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
}
}