Cấu hình schema
Cấu hình schemaSử dụng các directive có thể kết hợp

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ó:

  • @underEachArrayItem là meta directive
  • @strTranslate được lồng dưới @underEachArrayItem (giá trị mặc định ngầm định affectDirectivesUnderPos: [1])
{
  someField
    @underEachArrayItem
      @strTranslate
}

Trong ví dụ dưới đây, chúng ta có:

  • @strTranslate@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ó:

  • @underEachArrayItem là 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?:

Cài đặt cho Composable Directives
Cài đặt cho 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:

Composable Directives trong Schema Configuration
Composable Directives trong Schema Configuration