Thiết kế directive
Các directive đóng một vai trò quan trọng: chúng cho phép triển khai những tính năng không được hỗ trợ bởi đặc tả GraphQL hoặc bởi chính máy chủ GraphQL. Các directive có thể giúp lấp đầy khoảng trống về mặt chức năng, để API có thể đáp ứng các yêu cầu của mình, dù là những yêu cầu đã biết hay chưa biết.
Vì lý do này, các directive là một yếu tố cực kỳ quan trọng trong nền tảng của máy chủ GraphQL. Gato GraphQL dựa trên một thiết kế kiến trúc vững chắc và toàn diện cho các directive, giúp nó trở nên vừa có khả năng mở rộng vừa mạnh mẽ.
Chức năng cấp thấp
Theo quyết định thiết kế, engine phụ thuộc trực tiếp vào pipeline directive để xử lý query. Vì lý do này, các directive được coi là các thành phần cấp thấp, có quyền truy cập vào đối tượng nơi phản hồi được lưu trữ.
Do đó, bất kỳ directive tùy chỉnh nào cũng có khả năng sửa đổi phản hồi GraphQL.
Một trường hợp sử dụng rõ ràng là directive @remove, cho phép chỉ định trong query rằng chúng ta muốn bỏ qua phản hồi từ một trường thay vì nhận giá trị null (có một issue trong đặc tả liên quan đến tính năng này).
Các lần gọi directive hiệu quả
Các directive nhận tất cả các đối tượng và trường bị ảnh hưởng cùng một lúc, trong một lần thực thi duy nhất.
Ví dụ, việc gọi Google Translate API nên được thực hiện ít nhất có thể. Trong query này, nó chỉ được gọi một lần, chứa 10 đoạn văn bản cần dịch (2 trường, title và excerpt, cho 5 bài viết):
query {
posts(pagination:{ limit: 5 }) {
title
excerpt
titleES: title @translate(from: "en", to: "es")
excerptES: excerpt @translate(from: "en", to: "es")
}
}Trong query này có 3 lần gọi API, một lần cho mỗi ngôn ngữ (Tây Ban Nha, Pháp và Đức), mỗi lần 10 chuỗi, tất cả các lần gọi đều đồng thời:
query {
posts(pagination:{ limit: 5 }) {
title
excerpt
titleES: title @translate(from: "en", to: "es")
excerptES: excerpt @translate(from: "en", to: "es")
titleDE: title @translate(from: "en", to: "de")
excerptDE: excerpt @translate(from: "en", to: "de")
titleFR: title @translate(from: "en", to: "fr")
excerptFR: excerpt @translate(from: "en", to: "fr")
}
}Chữ ký hàm
Đây là giao diện field directive. Hãy chú ý các tham số mà hàm resolveDirective nhận:
public function resolveDirective(
RelationalTypeResolverInterface $relationalTypeResolver,
array $idFieldSet,
FieldDataAccessProviderInterface $fieldDataAccessProvider,
array $succeedingPipelineFieldDirectiveResolvers,
array $idObjects,
array $unionTypeOutputKeyIDs,
array $previouslyResolvedIDFieldValues,
array &$succeedingPipelineIDFieldSet,
array &$succeedingPipelineFieldDataAccessProviders,
array &$resolvedIDFieldValues,
array &$messages,
EngineIterationFeedbackStore $engineIterationFeedbackStore,
): void;Các tham số này thể hiện rõ bản chất cấp thấp của directive:
$idFieldSet: danh sách các ID theo trường cần được xử lý bởi directive$succeedingPipelineIDFieldSet: danh sách các ID theo trường cần được xử lý bởi các directive ở giai đoạn sau trong pipeline$resolvedIDFieldValues: đối tượng phản hồi
Các tham số còn lại cho phép: truy cập các biến của query và định nghĩa các biến động, truyền thông điệp với dữ liệu tùy chỉnh giữa các directive, tạo ra lỗi và cảnh báo, xác định và hiển thị các deprecation, và lưu trữ số liệu đo lường.