
Tính năng:
Tính năng tùy chỉnh cho Schema
Tính năng tùy chỉnh cho Schema
Nhiều tính năng được đề xuất cho đặc tả GraphQL đã được triển khai trong Gato GraphQL, vì vậy chúng ta không cần phải chờ đợi.
Đặt tên không gian cho Schema
Nếu cả hai plugin WooCommerce và Easy Digital Downloads đều triển khai kiểu Product cho GraphQL API, thì chúng ta không thể cài đặt cả hai plugin cùng lúc, vì các kiểu của chúng sẽ xung đột.
Đặt tên không gian cho schema cho phép tránh xung đột trong schema bằng cách thêm tên không gian vào tất cả tên kiểu. Do đó, kiểu Product sẽ trở thành Woo_Product và EDD_Product tương ứng, và các kiểu này có thể được thêm vào cùng một schema.
Hình ảnh này hiển thị một schema có tên không gian, trong đó các kiểu Event và Location được thêm tiền tố EM_ để tránh xung đột tên:

Trường toàn cục
Trường toàn cục là các trường có thể truy cập từ mọi kiểu trong schema GraphQL (trong khi chỉ được định nghĩa một lần).
Schema GraphQL cung cấp các kiểu như Post, User và Comment, cùng các trường có sẵn cho mỗi kiểu như Post.title, User.name và Comment.responses. Những trường này xử lý "dữ liệu", vì chúng truy xuất một phần dữ liệu cụ thể từ một thực thể.
Gato GraphQL, ngoài ra, còn cung cấp một loại trường khác: những trường cung cấp "chức năng" thay vì dữ liệu.
Một số ví dụ về trường toàn cục:
_not_if_equals_isEmpty_echo_sprintf_arrayItem_arrayAddItem_arrayUnique- và nhiều hơn nữa
Trường chức năng hữu ích để lấy dữ liệu được lưu trữ bên ngoài WordPress, và để xử lý dữ liệu sau khi đã được truy xuất, cho phép chúng ta biến đổi giá trị của một trường theo bất kỳ cách nào cần thiết, và cung cấp khả năng nhập/xuất dữ liệu mạnh mẽ.
Trường chức năng không thuộc về một kiểu cụ thể như Post hay User, mà thuộc về tất cả các kiểu trong schema. Đó là lý do tại sao chúng được xử lý theo cách đặc biệt trong Gato GraphQL, dưới tên gọi "trường toàn cục".
Field to input
Lấy giá trị của một trường, xử lý nó, và truyền vào một trường khác làm đầu vào, tất cả trong cùng một query.
query {
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Directive có thể kết hợp
Thông thường, một directive không thể được áp dụng cho một trường vì đầu vào của nó khác với đầu ra của trường đó. Ví dụ, directive @strUpperCase nhận một chuỗi làm đầu vào, nên không thể áp dụng cho trường User.capabilities vốn trả về một mảng chuỗi.
Với directive có thể kết hợp, một directive có thể tăng cường một directive khác để thay đổi hành vi của nó hoặc lấp đầy khoảng trống. Điều này loại bỏ nhu cầu sao chép các trường hay directive chỉ để thay đổi kiểu đầu vào hoặc kiểu trả về, tránh sự cồng kềnh.
Trong query này, directive @underEachArrayItem lặp qua một mảng chuỗi và áp dụng directive lồng nhau @strUpperCase lên từng phần tử, khắc phục sự không khớp kiểu:
query {
users {
capabilities
@underEachArrayItem
@strUpperCase
}
}Directive đa trường
Áp dụng directive cho nhiều trường (thay vì chỉ một), để cải thiện hiệu suất và mở rộng các trường hợp sử dụng.
Khi được kích hoạt, một tham số affectAdditionalFieldsUnderPos được thêm vào tất cả các directive, cho phép chỉ định vị trí tương đối của các trường bổ sung để áp dụng directive.
Ví dụ, trong query sau, directive @strTranslate chỉ được áp dụng cho trường content:
query {
posts {
excerpt
content @strTranslate
}
}Trường excerpt cũng có thể được áp dụng directive @strTranslate, bằng cách thêm tham số directive affectAdditionalFieldsUnderPos với giá trị [1] (vì 1 là vị trí tương đối của trường excerpt so với directive @strTranslate):
query {
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}Phiên bản hóa theo trường và directive
Tạo phiên bản cho các trường và directive độc lập với schema.
Thay vì phát triển toàn bộ schema (điều này yêu cầu phải sửa đổi tên của trường hoặc directive đã thay đổi), chúng ta có thể:
- Giữ các triển khai khác nhau dưới cùng tên trường hoặc directive
- Cung cấp triển khai cũ dưới một thẻ, sử dụng phiên bản ngữ nghĩa
- Truy cập một phiên bản cụ thể thông qua tham số trường/directive
versionConstraint
Phản hồi chủ động
Sử dụng mục nhập cấp cao nhất extensions để gửi dữ liệu về các deprecation và cảnh báo trong phản hồi cho query.
- Deprecation: Các deprecation được trả về trong cùng query liên quan đến các trường đã bị deprecated, và không chỉ khi thực hiện introspection.
- Cảnh báo: Cảnh báo là các vấn đề có thể được coi là không chặn, tức là chúng cải thiện query nhưng không làm hỏng nó.
Ví dụ, query sau xuất hai trường sử dụng cùng tên biến động "prop", điều này tạo ra một cảnh báo:
query {
posts {
excerpt @export(as: "prop")
content @export(as: "prop")
}
}Phản hồi sẽ bao gồm phần warnings (dưới extensions) với thông báo tương ứng:
{
"extensions": {
"warnings": [
{
"message": "Dynamic variable with name 'props' had already been set, had its value overridden",
"locations": [
{
"line": 4,
"column": 25
}
]
}
]
},
"data": {
"posts": {
"excerpt": "Hello world!",
"Content": "<p>Hello world!</p>"
}
}
}