Klien GraphQL yang ditulis dalam PHP yang menyediakan kelas generator kueri yang sangat sederhana namun kuat yang membuat proses interaksi dengan server GraphQL menjadi sangat sederhana.
Ada 3 cara utama menggunakan paket ini untuk menghasilkan kueri GraphQL Anda:
Query
secara dinamis. Ini dirancang untuk digunakan jika kueri dibuat secara dinamis.Jalankan perintah berikut untuk menginstal paket menggunakan composer:
$ composer require gmostafa/php-graphql-client
Untuk menghindari kerumitan menulis pertanyaan apa pun dan hanya berinteraksi dengan objek PHP yang dihasilkan dari skema API Anda, kunjungi repositori PHP GraphQL OQM
$ gql = ( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Kueri sederhana ini akan mengambil semua perusahaan yang menampilkan nama dan nomor serinya.
Kueri yang diberikan pada contoh sebelumnya direpresentasikan dalam "bentuk singkatan". Bentuk singkatannya melibatkan penulisan sejumlah baris kode yang dikurangi sehingga mempercepat proses penulisan kueri. Di bawah ini adalah contoh formulir lengkap untuk kueri yang sama persis seperti yang ditulis pada contoh sebelumnya.
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
)
]
);
Seperti terlihat pada contoh, bentuk steno lebih mudah dibaca dan ditulis, dan umumnya lebih disukai digunakan dibandingkan bentuk lengkap.
Formulir lengkap tidak boleh digunakan kecuali kueri tidak dapat direpresentasikan dalam bentuk singkatan, yang hanya memiliki satu kasus, ketika kita ingin menjalankan beberapa kueri dalam objek yang sama.
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
),
( new Query ( ' countries ' ))
-> setSelectionSet (
[
' name ' ,
' code ' ,
]
)
]
);
Kueri ini mengambil semua perusahaan dan negara yang menampilkan beberapa bidang data untuk masing-masing perusahaan. Ini pada dasarnya menjalankan dua (atau lebih jika diperlukan) kueri independen dalam satu amplop objek kueri.
Menulis beberapa kueri memerlukan penulisan objek kueri dalam bentuk lengkap untuk mewakili setiap kueri sebagai subbidang di bawah objek kueri induk.
$ gql = ( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber ' ,
( new Query ( ' branches ' ))
-> setSelectionSet (
[
' address ' ,
( new Query ( ' contracts ' ))
-> setSelectionSet ([ ' date ' ])
]
)
]
);
Kueri ini lebih kompleks, tidak hanya mengambil bidang skalar, namun juga bidang objek. Kueri ini mengembalikan semua perusahaan, menampilkan nama, nomor seri, dan untuk setiap perusahaan, semua cabangnya, menampilkan alamat cabang, dan untuk setiap alamat, ia mengambil semua kontrak yang terikat ke alamat ini, menampilkan tanggalnya.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' name ' => ' Tech Co. ' , ' first ' => 3 ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Kueri ini tidak mengambil semua perusahaan dengan menambahkan argumen. Kueri ini akan mengambil 3 perusahaan pertama dengan nama "Tech Co.", menampilkan nama dan nomor serinya.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' serialNumbers ' => [ 159 , 260 , 371 ]])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Kueri ini adalah kasus khusus dari kueri argumen. Dalam contoh ini, kueri hanya akan mengambil perusahaan dengan nomor seri di salah satu dari 159, 260, dan 371, yang menampilkan nama dan nomor seri.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' filter ' => new RawObject ( ' {name_starts_with: "Face"} ' )])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Kueri ini adalah kasus khusus lainnya dari kueri argumen. Dalam contoh ini, kami menyetel "filter" objek masukan khusus dengan beberapa nilai untuk membatasi perusahaan yang dikembalikan. Kami menyetel filter "name_starts_with" dengan nilai "Wajah". Kueri ini hanya akan mengambil perusahaan yang namanya dimulai dengan frasa "Wajah".
Kelas RawObject yang sedang dibangun digunakan untuk memasukkan string ke dalam kueri sebagaimana adanya. String apa pun yang dimasukkan ke dalam konstruktor RawObject akan dimasukkan ke dalam kueri sebagaimana adanya tanpa pemformatan khusus apa pun yang biasanya dilakukan oleh kelas kueri.
$ gql = ( new Query ( ' companies ' ))
-> setVariables (
[
new Variable ( ' name ' , ' String ' , true ),
new Variable ( ' limit ' , ' Int ' , false , 5 )
]
)
-> setArguments ([ ' name ' => ' $name ' , ' first ' => ' $limit ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Kueri ini menunjukkan bagaimana variabel dapat digunakan dalam paket ini untuk memungkinkan permintaan dinamis yang diaktifkan oleh standar GraphQL.
Kelas Variabel adalah kelas abadi yang mewakili variabel dalam standar GraphQL. Konstruktornya menerima 4 argumen:
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' , ' TechCo ' ))
-> setArguments ([ ' name ' => ' Tech Co. ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
),
( new Query ( ' companies ' , ' AnotherTechCo ' ))
-> setArguments ([ ' name ' => ' A.N. Other Tech Co. ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
)
]
);
Alias dapat diatur dalam argumen kedua konstruktor Kueri ketika objek yang sama perlu diambil beberapa kali dengan argumen berbeda.
$ gql = ( new Query ( ' companies ' ))
-> setAlias ( ' CompanyAlias ' )
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
Aliasnya juga bisa diatur melalui metode setter.
Saat menanyakan bidang yang mengembalikan tipe antarmuka, Anda mungkin perlu menggunakan fragmen sebaris untuk mengakses data pada tipe konkret yang mendasarinya.
Contoh ini menunjukkan cara membuat fragmen sebaris menggunakan paket ini:
$ gql = new Query ( ' companies ' );
$ gql -> setSelectionSet (
[
' serialNumber ' ,
' name ' ,
( new InlineFragment ( ' PrivateCompany ' ))
-> setSelectionSet (
[
' boardMembers ' ,
' shareholders ' ,
]
),
]
);
Kelas QueryBuilder dapat digunakan untuk membuat objek Query secara dinamis, yang dapat berguna dalam beberapa kasus. Cara kerjanya sangat mirip dengan kelas Query, namun pembuatan Query dibagi menjadi beberapa langkah.
Begitulah contoh "Query With Input Object Argument" dapat dibuat menggunakan QueryBuilder:
$ builder = ( new QueryBuilder ( ' companies ' ))
-> setVariable ( ' namePrefix ' , ' String ' , true )
-> setArgument ( ' filter ' , new RawObject ( ' {name_starts_with: $namePrefix} ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
Seperti halnya kelas Query, alias dapat disetel menggunakan argumen konstruktor kedua.
$ builder = ( new QueryBuilder ( ' companies ' , ' CompanyAlias ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
Atau melalui metode setter
$ builder = ( new QueryBuilder ( ' companies ' ))
-> setAlias ( ' CompanyAlias ' )
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
Sama seperti kelas Query, kelas QueryBuilder dapat ditulis dalam bentuk lengkap untuk memungkinkan penulisan beberapa kueri dalam satu objek pembuat kueri. Di bawah ini adalah contoh bagaimana formulir lengkap dapat digunakan dengan QueryBuilder:
$ builder = ( new QueryBuilder ())
-> setVariable ( ' namePrefix ' , ' String ' , true )
-> selectField (
( new QueryBuilder ( ' companies ' ))
-> setArgument ( ' filter ' , new RawObject ( ' {name_starts_with: $namePrefix} ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' )
)
-> selectField (
( new QueryBuilder ( ' company ' ))
-> setArgument ( ' serialNumber ' , 123 )
-> selectField ( ' name ' )
);
$ gql = $ builder -> getQuery ();
Kueri ini merupakan perpanjangan dari kueri pada contoh sebelumnya. Ia mengembalikan semua perusahaan yang dimulai dengan awalan nama dan mengembalikan perusahaan dengan serialNumber
nilai 123, keduanya dalam respons yang sama.
Objek Klien dapat dengan mudah dibuat instance-nya dengan menyediakan URL titik akhir GraphQL.
Konstruktor Klien juga menerima array "authorizationHeaders" opsional, yang dapat digunakan untuk menambahkan header otorisasi ke semua permintaan yang dikirim ke server GraphQL.
Contoh:
$ client = new Client (
' http://api.graphql.com ' ,
[ ' Authorization ' => ' Basic xyz ' ]
);
Konstruktor Klien juga menerima array opsional "httpOptions", yang menggantikan "authorizationHeaders" dan dapat digunakan untuk menambahkan opsi permintaan Klien HTTP Guzzle khusus.
Contoh:
$ client = new Client (
' http://api.graphql.com ' ,
[],
[
' connect_timeout ' => 5 ,
' timeout ' => 5 ,
' headers ' => [
' Authorization ' => ' Basic xyz '
'User-Agent' => ' testing/1.0 ' ,
],
' proxy ' => [
' http ' => ' tcp://localhost:8125 ' , // Use this proxy with "http"
' https ' => ' tcp://localhost:9124 ' , // Use this proxy with "https",
' no ' => [ ' .mit.edu ' , ' foo.com ' ] // Don't use a proxy with these
],
' cert ' => [ ' /path/server.pem ' , ' password ' ]
. . .
]
);
Dimungkinkan untuk menggunakan klien HTTP Anda sendiri yang telah dikonfigurasi sebelumnya yang mengimplementasikan antarmuka PSR-18.
Contoh:
$ client = new Client (
' http://api.graphql.com ' ,
[],
[],
$ myHttpClient
);
Menjalankan kueri dengan klien GraphQL dan mendapatkan hasil dalam struktur objek:
$ results = $ client -> runQuery ( $ gql );
$ results -> getData ()-> companies [ 0 ]-> branches ;
Atau mendapatkan hasil dalam struktur array:
$ results = $ client -> runQuery ( $ gql , true );
$ results -> getData ()[ ' companies ' ][ 1 ][ ' branches ' ][ ' address ' ];
Menjalankan kueri yang berisi variabel memerlukan penerusan array asosiatif yang memetakan nama variabel (kunci) ke nilai variabel (nilai) ke metode runQuery
. Berikut ini contohnya:
$ gql = ( new Query ( ' companies ' ))
-> setVariables (
[
new Variable ( ' name ' , ' String ' , true ),
new Variable ( ' limit ' , ' Int ' , false , 5 )
]
)
-> setArguments ([ ' name ' => ' $name ' , ' first ' => ' $limit ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
$ variablesArray = [ ' name ' => ' Tech Co. ' , ' first ' => 5 ];
$ results = $ client -> runQuery ( $ gql , true , $ variablesArray );
Mutasi mengikuti aturan kueri yang sama di GraphQL, mereka memilih bidang pada objek yang dikembalikan, menerima argumen, dan dapat memiliki subbidang.
Berikut ini contoh contoh cara membuat dan menjalankan mutasi:
$ mutation = ( new Mutation ( ' createCompany ' ))
-> setArguments ([ ' companyObject ' => new RawObject ( ' {name: "Trial Company", employees: 200} ' )])
-> setSelectionSet (
[
' _id ' ,
' name ' ,
' serialNumber ' ,
]
);
$ results = $ client -> runQuery ( $ mutation );
Mutasi dapat dijalankan oleh klien dengan cara yang sama seperti kueri dijalankan.
Mutasi dapat memanfaatkan variabel dengan cara yang sama seperti Kueri. Berikut ini contoh cara menggunakan variabel untuk meneruskan objek input ke server GraphQL secara dinamis:
$ mutation = ( new Mutation ( ' createCompany ' ))
-> setVariables ([ new Variable ( ' company ' , ' CompanyInputObject ' , true )])
-> setArguments ([ ' companyObject ' => ' $company ' ]);
$ variables = [ ' company ' => [ ' name ' => ' Tech Company ' , ' type ' => ' Testing ' , ' size ' => ' Medium ' ]];
$ client -> runQuery (
$ mutation , true , $ variables
);
Ini adalah mutasi yang dihasilkan dan variabel yang diteruskan:
mutation( $ company : CompanyInputObject!) {
createCompany (companyObject: $ company )
}
{"company":{"name":"Tech Company", " type " :"Testing", " size " :"Medium"}}
GraphQL Pokemon adalah API GraphQL publik yang sangat keren yang tersedia untuk mengambil data Pokemon. API tersedia untuk umum di web, kami akan menggunakannya untuk mendemonstrasikan kemampuan klien ini.
Tautan Repo Github: https://github.com/lucasbento/graphql-pokemon
Tautan API: https://graphql-pokemon.now.sh/
Kueri ini mengambil evolusi pokemon dan serangannya:
query( $ name : String!) {
pokemon (name: $ name ) {
id
number
name
evolutions {
id
number
name
weight {
minimum
maximum
}
attacks {
fast {
name
type
damage
}
}
}
}
}
Begitulah cara kueri ini dapat ditulis menggunakan kelas kueri dan dijalankan menggunakan klien:
$ client = new Client (
' https://graphql-pokemon.now.sh/ '
);
$ gql = ( new Query ( ' pokemon ' ))
-> setVariables ([ new Variable ( ' name ' , ' String ' , true )])
-> setArguments ([ ' name ' => ' $name ' ])
-> setSelectionSet (
[
' id ' ,
' number ' ,
' name ' ,
( new Query ( ' evolutions ' ))
-> setSelectionSet (
[
' id ' ,
' number ' ,
' name ' ,
( new Query ( ' attacks ' ))
-> setSelectionSet (
[
( new Query ( ' fast ' ))
-> setSelectionSet (
[
' name ' ,
' type ' ,
' damage ' ,
]
)
]
)
]
)
]
);
try {
$ name = readline ( ' Enter pokemon name: ' );
$ results = $ client -> runQuery ( $ gql , true , [ ' name ' => $ name ]);
}
catch ( QueryError $ exception ) {
print_r ( $ exception -> getErrorDetails ());
exit ;
}
print_r ( $ results -> getData ()[ ' pokemon ' ]);
Atau sebagai alternatif, Begitulah cara kueri ini dapat dibuat menggunakan kelas QueryBuilder:
$ client = new Client (
' https://graphql-pokemon.now.sh/ '
);
$ builder = ( new QueryBuilder ( ' pokemon ' ))
-> setVariable ( ' name ' , ' String ' , true )
-> setArgument ( ' name ' , ' $name ' )
-> selectField ( ' id ' )
-> selectField ( ' number ' )
-> selectField ( ' name ' )
-> selectField (
( new QueryBuilder ( ' evolutions ' ))
-> selectField ( ' id ' )
-> selectField ( ' name ' )
-> selectField ( ' number ' )
-> selectField (
( new QueryBuilder ( ' attacks ' ))
-> selectField (
( new QueryBuilder ( ' fast ' ))
-> selectField ( ' name ' )
-> selectField ( ' type ' )
-> selectField ( ' damage ' )
)
)
);
try {
$ name = readline ( ' Enter pokemon name: ' );
$ results = $ client -> runQuery ( $ builder , true , [ ' name ' => $ name ]);
}
catch ( QueryError $ exception ) {
print_r ( $ exception -> getErrorDetails ());
exit ;
}
print_r ( $ results -> getData ()[ ' pokemon ' ]);
Meskipun bukan tujuan utama paket ini, namun mendukung menjalankan kueri string mentah, sama seperti klien lain yang menggunakan metode runRawQuery
di kelas Client
. Berikut ini contoh cara menggunakannya:
$ gql = <<<QUERY
query {
pokemon(name: "Pikachu") {
id
number
name
attacks {
special {
name
type
damage
}
}
}
}
QUERY ;
$ results = $ client -> runRawQuery ( $ gql );