Sử dụng các directive có thể kết hợp
Cho phép một directive thay đổi hành vi của một directive khác.
Chức năng này cho phép sử dụng một directive khi lẽ ra không thể sử dụng được do không khớp kiểu dữ liệu (tức là khi một directive không thể áp dụng cho trường vì đầu vào của nó khác với đầu ra của trường).
Ví dụ, trường capabilities trả về [String] (một mảng chuỗi), còn directive @strUpperCase nhận vào String. Do đó, thực thi queries sau đây sẽ trả về lỗi do không khớp kiểu dữ liệu:
query {
user(by: {id: 1}) {
capabilities @strUpperCase
}
}Với các directive có thể kết hợp, chúng ta có thể dùng directive @underEachArrayItem (duyệt qua từng phần tử trong mảng và áp dụng directive lồng bên trong lên từng phần tử) để chuẩn bị trước khi @strUpperCase được thực thi, khiến nó nhận một phần tử đơn (kiểu String).
Queries ở trên có thể được thực hiện như sau:
query {
user(by: {id: 1}) {
capabilities
@underEachArrayItem
@strUpperCase
}
}Meta directive
Mỗi meta directive có thể ảnh hưởng (hay "lồng") nhiều directive cùng một lúc. Các directive bị ảnh hưởng được chỉ định thông qua đối số affectDirectivesUnderPos, nhận vào một mảng các số nguyên dương, mỗi số định nghĩa vị trí tương đối của directive bị ảnh hưởng.
Theo mặc định, đối số affectDirectivesUnderPos có giá trị mặc định là [1], nghĩa là nó sẽ ảnh hưởng đến directive nằm ngay bên cạnh nó.
Trong ví dụ dưới đây, chúng ta có:
@underEachArrayItemlà meta directive@strTranslateđược lồng dưới@underEachArrayItem(giá trị mặc định ngầm địnhaffectDirectivesUnderPos: [1])
{
someField
@underEachArrayItem
@strTranslate
}Trong ví dụ dưới đây, chúng ta có:
@strTranslatevà@strUpperCaseđược lồng dưới@underEachArrayItem(như được chỉ ra bởi các vị trí tương đối[1, 2]trong đối sốaffectDirectivesUnderPos)
{
someField
@underEachArrayItem(affectDirectivesUnderPos: [1, 2])
@strTranslate
@strUpperCase
}Các meta directive cũng có thể được lồng bên trong các meta directive khác.
Trong ví dụ dưới đây, chúng ta có:
@underEachArrayItemlà meta directive ở cấp cao nhất@underJSONObjectPropertyđược lồng dưới@underEachArrayItem@strUpperCaseđược lồng dưới@underJSONObjectProperty
query UppercaseEntriesInsideObject {
entries: _echo(value: [
{
text: "Hello my friends"
},
{
text: "How do you like this software so far?"
}
])
@underEachArrayItem
@underJSONObjectProperty(by: { key: "text" })
@strUpperCase
}Cấu hình
Để bật hoặc tắt các directive có thể kết hợp trong schema GraphQL, hãy vào module "Composable Directives" trên trang Settings và đánh dấu/bỏ đánh dấu hộp kiểm Enable composable directives?:

Để bật hoặc tắt các directive có thể kết hợp trên một endpoint cụ thể, hãy chọn tùy chọn mong muốn trong khối "Composable Directives" từ Schema Configuration tương ứng:
