Cấu hình schema
Cấu hình schemaPhân vùng tên (Namespacing) Schema

Phân vùng tên (Namespacing) Schema

Tự động thêm namespace cho tất cả các type và interface được plugin thêm vào schema.

Phân vùng tên schema giúp tránh xung đột tên, xảy ra khi các chủ thể khác nhau (ví dụ: các nhóm khác nhau trong công ty, hoặc giữa các plugin bên thứ ba) sử dụng cùng một tên cho một type hoặc interface.

Ví dụ, giả sử công ty "AwesomeWP" có nhóm Tutorials và nhóm Sales, và cả hai đều tạo một type Product cho schema GraphQL của công ty, gây ra xung đột.

Khi áp dụng phân vùng tên cho schema, hai type đó sẽ tự động được chuyển thành AwesomeWPTutorialsProductAwesomeWPSalesProduct, tránh xung đột mà không cần chỉnh sửa schema thủ công hay yêu cầu các nhóm phối hợp với nhau.

Các thực thể từ mô hình dữ liệu WordPress không được đặt namespace

Mô hình dữ liệu WordPress được coi là chuẩn, và các type của schema GraphQL (như PostUser) cũng như các interface (như CommentableWithMeta) không được đặt namespace.

Phân vùng tên schema trong các endpoint

Có 2 cấp độ để xác định liệu schema có được đặt namespace hay không. Theo thứ tự ưu tiên:

1. Trong cấu hình schema

Việc đặt namespace cho schema đối với một custom endpoint hoặc persisted query có thể được định nghĩa thông qua cấu hình schema tương ứng:

Namespacing, được thiết lập trong cấu hình Schema

2. Chế độ mặc định, được định nghĩa trong Cài đặt

Nếu cấu hình schema có giá trị "Default", nó sẽ sử dụng chế độ được định nghĩa trong Cài đặt:

Namespacing trong Cài đặt
Namespacing trong Cài đặt

Trực quan hóa schema đã được đặt namespace

Sử dụng Voyager client để trực quan hóa schema đã được đặt namespace.

Khi namespacing bị tắt, schema WordPress trông như sau:

Schema tương tác

Khi được bật, các type và interface được thêm bởi plugin sẽ được đặt namespace, trông như sau:

Schema tương tác có namespace

Truy vấn tên type (có/không có) namespace

Sau khi bật namespacing, các type có thể được truy vấn bằng cả tên có namespace lẫn tên không có namespace. Do đó, chỉ những queries liên quan đến các type xung đột mới cần được chỉnh sửa, không phải tất cả.

Ví dụ, nếu nhóm Sales của AwesomeWP cũng có một type Discount, một query yêu cầu tên type này vẫn hoạt động bình thường:

query {
  discounts {
    ...DiscountProps
  }
}
 
fragment DiscountProps on Discount {
  price
  dateRange
}

Chỉ type xung đột Product mới cần được cập nhật thành AwesomeWPSalesProduct trong query, để loại bỏ mọi sự mơ hồ:

query {
  products {
    ...ProductProps
  }
}
 
fragment ProductProps on AwesomeWPSalesProduct {
  price
  dateRange
}

Đặc tả GraphQL

Chức năng này hiện chưa là một phần của đặc tả GraphQL, nhưng đã được đề xuất trong: