Gunakan Facebook GraphQL dengan Laravel 5 atau Lumen. Hal ini didasarkan pada implementasi PHP di sini. Anda dapat menemukan informasi lebih lanjut tentang GraphQL di Pengenalan GraphQL di blog React atau Anda dapat membaca spesifikasi GraphQL. Ini sedang dalam proses.
Paket ini kompatibel dengan model Eloquent (atau sumber data lainnya). Lihat contoh di bawah ini.
Versi 1.0 dirilis. Jika Anda mengupgrade dari versi yang lebih lama, Anda dapat mencentang Upgrade to 1.0.
1- Memerlukan paket melalui Composer di composer.json
Anda.
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- Jalankan Komposer untuk menginstal atau memperbarui persyaratan baru.
$ composer install
atau
$ composer update
1- Publikasikan file konfigurasi
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- Tinjau file konfigurasi
config/graphql.php
1- Tambahkan penyedia layanan ke file config/app.php
Anda
Folklore GraphQL ServiceProvider::class,
2- Tambahkan fasad ke file config/app.php
Anda
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- Publikasikan file konfigurasi
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- Tinjau file konfigurasi
config/graphql.php
1- Muat penyedia layanan di bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- Untuk menggunakan fasad Anda harus menghapus komentar pada baris $app->withFacades();
di bootstrap/app.php
Setelah menghapus komentar pada baris ini, Anda telah mengaktifkan fasad GraphQL
$ app -> withFacades ();
3- Publikasikan file konfigurasi
$ php artisan graphql:publish
4- Muat file konfigurasi di bootstrap/app.php
Penting : perintah ini perlu dijalankan sebelum pendaftaran penyedia layanan
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- Tinjau file konfigurasi
config/graphql.php
Mulai dari versi 1.0, Anda dapat menentukan beberapa skema. Memiliki beberapa skema dapat berguna jika, misalnya, Anda menginginkan titik akhir yang bersifat publik dan titik akhir lain yang memerlukan autentikasi.
Anda dapat menentukan beberapa skema di konfigurasi:
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
Atau Anda dapat menambahkan skema menggunakan fasad:
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
Setelah itu, Anda dapat membuat skema menggunakan fasad:
// Will return the default schema defined by 'schema' in the config
$ schema = GraphQL:: schema ();
// Will return the 'secret' schema
$ schema = GraphQL:: schema ( ' secret ' );
// Will build a new schema
$ schema = GraphQL:: schema ([
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]);
Atau Anda dapat meminta titik akhir untuk skema tertentu
// Default schema
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
// Secret schema
http://homestead.app/graphql/secret?query=query+FetchUsers{users{id,email}}
Pertama, Anda perlu membuat tipe.
namespace App GraphQL Type ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Type as GraphQLType ;
class UserType extends GraphQLType
{
protected $ attributes = [
' name ' => ' User ' ,
' description ' => ' A user '
];
/ *
* Uncomment following line to make the type input object .
* http : // graphql . org / learn / schema / #input-types
* /
// protected $ inputObject = true ;
public function fields ()
{
return [
' id ' => [
' type ' => Type:: nonNull (Type:: string ()),
' description ' => ' The id of the user '
],
' email ' => [
' type ' => Type:: string (),
' description ' => ' The email of user '
]
];
}
// If you want to resolve the field yourself , you can declare a method
// with the following format resolve [ FIELD_NAME ] Field ()
protected function resolveEmailField ( $ root , $ args )
{
return strtolower ( $ root -> email );
}
}
Tambahkan tipe ke file konfigurasi config/graphql.php
' types ' => [
' User ' => ' AppGraphQLTypeUserType '
]
Anda juga dapat menambahkan tipe dengan Fasad GraphQL
, misalnya di penyedia layanan.
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
Maka Anda perlu mendefinisikan kueri yang mengembalikan tipe ini (atau daftar). Anda juga dapat menentukan argumen yang dapat Anda gunakan dalam metode penyelesaian.
namespace App GraphQL Query ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Query ;
use App User ;
class UsersQuery extends Query
{
protected $ attributes = [
' name ' => ' users '
];
public function type ()
{
return Type:: listOf (GraphQL:: type ( ' User ' ));
}
public function args ()
{
return [
' id ' => [ ' name ' => ' id ' , ' type ' => Type:: string ()],
' email ' => [ ' name ' => ' email ' , ' type ' => Type:: string ()]
];
}
public function resolve ( $ root , $ args )
{
if ( isset ( $ args [ ' id ' ])) {
return User:: where ( ' id ' , $ args [ ' id ' ])-> get ();
} else if ( isset ( $ args [ ' email ' ])) {
return User:: where ( ' email ' , $ args [ ' email ' ])-> get ();
} else {
return User:: all ();
}
}
}
Tambahkan kueri ke file konfigurasi config/graphql.php
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
Dan itu saja. Anda seharusnya dapat menanyakan GraphQL dengan permintaan ke url /graphql
(atau apa pun yang Anda pilih di konfigurasi Anda). Coba permintaan GET dengan input query
berikut
query FetchUsers {
users {
id
email
}
}
Misalnya, jika Anda menggunakan wisma:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Mutasi sama seperti kueri lainnya, ia menerima argumen (yang akan digunakan untuk melakukan mutasi) dan mengembalikan objek dengan tipe tertentu.
Misalnya mutasi untuk memperbarui password pengguna. Pertama, Anda perlu mendefinisikan Mutasi.
namespace App GraphQL Mutation ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Mutation ;
use App User ;
class UpdateUserPasswordMutation extends Mutation
{
protected $ attributes = [
' name ' => ' updateUserPassword '
];
public function type ()
{
return GraphQL:: type ( ' User ' );
}
public function args ()
{
return [
' id ' => [ ' name ' => ' id ' , ' type ' => Type:: nonNull (Type:: string ())],
' password ' => [ ' name ' => ' password ' , ' type ' => Type:: nonNull (Type:: string ())]
];
}
public function resolve ( $ root , $ args )
{
$ user = User:: find ( $ args [ ' id ' ]);
if (! $ user ) {
return null ;
}
$ user -> password = bcrypt ( $ args [ ' password ' ]);
$ user -> save ();
return $ user ;
}
}
Seperti yang Anda lihat dalam metode resolve
, Anda menggunakan argumen untuk memperbarui model Anda dan mengembalikannya.
Anda kemudian menambahkan mutasi ke file konfigurasi config/graphql.php
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
Anda kemudian dapat menggunakan kueri berikut di titik akhir Anda untuk melakukan mutasi.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
jika Anda menggunakan wisma:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
Dimungkinkan untuk menambahkan aturan validasi ke mutasi. Ia menggunakan Validator
laravel untuk melakukan validasi terhadap args
.
Saat membuat mutasi, Anda dapat menambahkan metode untuk menentukan aturan validasi yang berlaku dengan melakukan hal berikut:
namespace App GraphQL Mutation ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Mutation ;
use App User ;
class UpdateUserEmailMutation extends Mutation
{
protected $ attributes = [
' name ' => ' UpdateUserEmail '
];
public function type ()
{
return GraphQL:: type ( ' User ' );
}
public function args ()
{
return [
' id ' => [ ' name ' => ' id ' , ' type ' => Type:: string ()],
' email ' => [ ' name ' => ' email ' , ' type ' => Type:: string ()]
];
}
public function rules ()
{
return [
' id ' => [ ' required ' ],
' email ' => [ ' required ' , ' email ' ]
];
}
public function resolve ( $ root , $ args )
{
$ user = User:: find ( $ args [ ' id ' ]);
if (! $ user ) {
return null ;
}
$ user -> email = $ args [ ' email ' ];
$ user -> save ();
return $ user ;
}
}
Alternatifnya, Anda dapat menentukan aturan dengan setiap argumen
class UpdateUserEmailMutation extends Mutation
{
// ...
public function args ()
{
return [
' id ' => [
' name ' => ' id ' ,
' type ' => Type:: string (),
' rules ' => [ ' required ' ]
],
' email ' => [
' name ' => ' email ' ,
' type ' => Type:: string (),
' rules ' => [ ' required ' , ' email ' ]
]
];
}
// ...
}
Saat Anda menjalankan mutasi, ini akan mengembalikan kesalahan validasi. Karena spesifikasi GraphQL menentukan format kesalahan tertentu, pesan kesalahan validasi ditambahkan ke objek kesalahan sebagai atribut validation
tambahan. Untuk menemukan kesalahan validasi, Anda harus memeriksa kesalahan dengan message
yang sama dengan 'validation'
, maka atribut validation
akan berisi pesan kesalahan normal yang dikembalikan oleh Laravel Validator.
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}