
Fitur:
Fitur Kustom untuk Skema
Fitur Kustom untuk Skema
Berbagai fitur yang diusulkan untuk spesifikasi GraphQL sudah diimplementasikan di Gato GraphQL, sehingga kita tidak perlu menunggu.
Namespacing skema
Jika plugin WooCommerce dan Easy Digital Downloads keduanya mengimplementasikan tipe Product untuk API GraphQL, kita tidak bisa menginstal kedua plugin tersebut secara bersamaan, karena tipe-tipenya akan berkonflik.
Namespacing skema memungkinkan untuk menghindari konflik dalam skema, dengan memberikan namespace pada semua nama tipe. Dengan demikian, tipe Product akan menjadi Woo_Product dan EDD_Product masing-masing, dan tipe-tipe ini dapat ditambahkan ke skema yang sama.
Gambar ini menunjukkan skema dengan namespacing, di mana tipe Event dan Location diberi prefiks EM_ untuk menghindari tabrakan nama:

Field global
Field global adalah field yang dapat diakses dari setiap tipe dalam skema GraphQL (meski hanya didefinisikan sekali).
Skema GraphQL mengekspos tipe-tipe seperti Post, User, dan Comment, beserta field yang tersedia untuk setiap tipe, seperti Post.title, User.name, dan Comment.responses. Field-field ini berurusan dengan "data", karena mengambil potongan data tertentu dari sebuah entitas.
Gato GraphQL, selain itu, juga menawarkan jenis field yang berbeda: field yang menyediakan "fungsionalitas" daripada data.
Beberapa contoh field global adalah:
_not_if_equals_isEmpty_echo_sprintf_arrayItem_arrayAddItem_arrayUnique- dan banyak lagi
Field fungsionalitas berguna untuk mendapatkan data yang tersimpan di luar WordPress, dan untuk memanipulasi data setelah diambil, memungkinkan kita mengubah nilai field dengan cara apa pun yang diperlukan, serta memberikan kemampuan impor/ekspor data yang powerful.
Field fungsionalitas bukan milik tipe tertentu, seperti Post atau User, melainkan milik semua tipe dalam skema. Itulah mengapa field-field ini ditangani dengan cara yang khas di Gato GraphQL, dengan nama "field global".
Field to input
Dapatkan nilai dari sebuah field, manipulasi nilainya, dan masukkan sebagai input ke field lain, semuanya dalam query yang sama.
query {
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Directive yang dapat dikomposisikan
Sering kali, sebuah directive tidak dapat diterapkan pada suatu field karena memiliki input yang berbeda dari output field tersebut. Misalnya, directive @strUpperCase menerima string sebagai input, sehingga tidak dapat diterapkan pada field User.capabilities, yang mengembalikan array string.
Dengan directive yang dapat dikomposisikan, sebuah directive dapat memperluas directive lain untuk mengubah perilakunya atau mengisi kekurangan. Ini menghilangkan kebutuhan untuk menduplikasi field atau directive hanya untuk mengubah tipe input atau tipe kembaliannya, sehingga menghindari pembengkakan.
Dalam query ini, directive @underEachArrayItem melakukan iterasi pada array string, dan menerapkan directive bersarangnya @strUpperCase pada setiap elemen, memperbaiki ketidakcocokan tipe:
query {
users {
capabilities
@underEachArrayItem
@strUpperCase
}
}Directive multi-field
Terapkan directive pada beberapa field (bukan hanya satu), untuk performa yang lebih baik dan kasus penggunaan yang lebih luas.
Ketika diaktifkan, argumen affectAdditionalFieldsUnderPos ditambahkan ke semua directive, di mana posisi relatif field tambahan yang akan diterapkan directive dapat ditentukan.
Misalnya, dalam query berikut, directive @strTranslate hanya diterapkan pada field content:
query {
posts {
excerpt
content @strTranslate
}
}Field excerpt juga dapat diterapkan directive @strTranslate, dengan menambahkan argumen directive affectAdditionalFieldsUnderPos dengan nilai [1] (karena 1 adalah posisi relatif field excerpt dari directive @strTranslate):
query {
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}Versioning berbasis field dan directive
Versi field dan directive secara independen dari skema.
Alih-alih mengembangkan seluruh skema (yang mengharuskan pengubahan nama field atau directive yang dimodifikasi), kita dapat:
- Menyimpan implementasi yang berbeda di bawah nama field atau directive yang sama
- Mengekspos implementasi lama di bawah sebuah tag, menggunakan semantic versioning
- Mengakses versi tertentu melalui argumen field/directive
versionConstraint
Umpan balik proaktif
Gunakan entri tingkat atas extensions untuk mengirimkan data mengenai deprecation dan peringatan dalam respons terhadap query.
- Deprecation: Deprecation dikembalikan dalam query yang sama yang melibatkan field yang sudah deprecated, bukan hanya saat melakukan introspeksi.
- Peringatan: Peringatan adalah masalah yang dapat dianggap tidak memblokir, yaitu masalah yang meningkatkan query tetapi tidak merusaknya.
Misalnya, query berikut mengekspor dua field menggunakan nama variabel dinamis yang sama "prop", yang menghasilkan peringatan:
query {
posts {
excerpt @export(as: "prop")
content @export(as: "prop")
}
}Respons akan menyertakan bagian warnings (di bawah extensions) dengan pesan yang sesuai:
{
"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>"
}
}
}