ใช้ Facebook GraphQL กับ Laravel 5 หรือ Lumen มันขึ้นอยู่กับการใช้งาน PHP ที่นี่ คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับ GraphQL ได้ในบทนำ GraphQL ในบล็อก React หรือคุณสามารถอ่านข้อกำหนดของ GraphQL นี่คืองานที่อยู่ระหว่างดำเนินการ
แพ็คเกจนี้เข้ากันได้กับโมเดล Eloquent (หรือแหล่งข้อมูลอื่น ๆ ) ดูตัวอย่างด้านล่าง
เวอร์ชัน 1.0 เปิดตัวแล้ว หากคุณกำลังอัปเกรดจากเวอร์ชันเก่า คุณสามารถตรวจสอบอัปเกรดเป็น 1.0 ได้
1- ต้องการแพ็คเกจผ่าน Composer ใน composer.json
ของคุณ
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- เรียกใช้ Composer เพื่อติดตั้งหรืออัปเดตข้อกำหนดใหม่
$ composer install
หรือ
$ composer update
1- เผยแพร่ไฟล์การกำหนดค่า
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- ตรวจสอบไฟล์การกำหนดค่า
config/graphql.php
1- เพิ่มผู้ให้บริการลงในไฟล์ config/app.php
ของคุณ
Folklore GraphQL ServiceProvider::class,
2- เพิ่มส่วนหน้าให้กับไฟล์ config/app.php
ของคุณ
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- เผยแพร่ไฟล์การกำหนดค่า
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- ตรวจสอบไฟล์การกำหนดค่า
config/graphql.php
1- โหลดผู้ให้บริการใน bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- สำหรับการใช้ส่วนหน้า คุณต้องยกเลิกการใส่เครื่องหมายบรรทัด $app->withFacades();
ใน bootstrap/app.php
หลังจากยกเลิกการใส่เครื่องหมายบรรทัดนี้ คุณจะเปิดใช้งานส่วนหน้าของ GraphQL
$ app -> withFacades ();
3- เผยแพร่ไฟล์การกำหนดค่า
$ php artisan graphql:publish
4- โหลดไฟล์การกำหนดค่าใน bootstrap/app.php
ข้อสำคัญ : คำสั่งนี้จะต้องดำเนินการก่อนการลงทะเบียนของผู้ให้บริการ
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- ตรวจสอบไฟล์การกำหนดค่า
config/graphql.php
ตั้งแต่เวอร์ชัน 1.0 คุณสามารถกำหนดหลายสคีมาได้ การมีสคีมาหลายรายการอาจมีประโยชน์ เช่น หากคุณต้องการปลายทางที่เป็นสาธารณะและอีกสคีมาต้องมีการรับรองความถูกต้อง
คุณสามารถกำหนดสคีมาได้หลายรายการในการกำหนดค่า:
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
หรือคุณสามารถเพิ่มสคีมาโดยใช้ส่วนหน้า:
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
หลังจากนั้น คุณสามารถสร้างสคีมาโดยใช้ส่วนหน้า:
// 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'
]
]);
หรือคุณสามารถขอตำแหน่งข้อมูลสำหรับสคีมาเฉพาะได้
// 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}}
ก่อนอื่นคุณต้องสร้างประเภท
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 );
}
}
เพิ่มประเภทลงในไฟล์การกำหนดค่า config/graphql.php
' types ' => [
' User ' => ' AppGraphQLTypeUserType '
]
คุณสามารถเพิ่มประเภทด้วย GraphQL
Facade ในผู้ให้บริการได้เช่นกัน
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
จากนั้นคุณจะต้องกำหนดการสืบค้นที่ส่งคืนประเภทนี้ (หรือรายการ) คุณยังสามารถระบุอาร์กิวเมนต์ที่คุณสามารถใช้ในวิธีการแก้ไขได้
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 ();
}
}
}
เพิ่มแบบสอบถามลงในไฟล์การกำหนดค่า config/graphql.php
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
และนั่นมัน คุณควรจะสามารถสืบค้น GraphQL ด้วยการร้องขอไปยัง url /graphql
(หรืออะไรก็ได้ที่คุณเลือกในการกำหนดค่าของคุณ) ลองใช้คำขอ GET ด้วยการป้อนข้อมูล query
ต่อไปนี้
query FetchUsers {
users {
id
email
}
}
ตัวอย่างเช่น หากคุณใช้โฮมสเตด:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
การกลายพันธุ์ก็เหมือนกับแบบสอบถามอื่นๆ โดยจะยอมรับอาร์กิวเมนต์ (ซึ่งจะถูกใช้เพื่อทำการกลายพันธุ์) และส่งคืนออบเจ็กต์บางประเภท
เช่น การเปลี่ยนแปลงเพื่ออัพเดตรหัสผ่านของผู้ใช้ ก่อนอื่นคุณต้องกำหนดการกลายพันธุ์
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 ;
}
}
ดังที่คุณเห็นในวิธี resolve
คุณใช้อาร์กิวเมนต์เพื่ออัปเดตโมเดลของคุณและส่งคืนโมเดล
จากนั้นคุณเพิ่มการเปลี่ยนแปลงให้กับไฟล์การกำหนดค่า config/graphql.php
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
จากนั้นคุณควรจะสามารถใช้แบบสอบถามต่อไปนี้บนปลายทางของคุณเพื่อทำการเปลี่ยนแปลงได้
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
ถ้าคุณใช้โฮมสเตด:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
คุณสามารถเพิ่มกฎการตรวจสอบความถูกต้องให้กับการกลายพันธุ์ได้ มันใช้ laravel Validator
เพื่อทำการตรวจสอบกับ args
เมื่อสร้างการเปลี่ยนแปลง คุณสามารถเพิ่มวิธีการเพื่อกำหนดกฎการตรวจสอบที่ใช้โดยทำดังต่อไปนี้:
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 ;
}
}
หรือคุณสามารถกำหนดกฎกับแต่ละ args ได้
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 ' ]
]
];
}
// ...
}
เมื่อคุณดำเนินการเปลี่ยนแปลง จะส่งกลับข้อผิดพลาดในการตรวจสอบความถูกต้อง เนื่องจากข้อกำหนด GraphQL กำหนดรูปแบบที่แน่นอนสำหรับข้อผิดพลาด ข้อความแสดงข้อผิดพลาดในการตรวจสอบความถูกต้องจึงถูกเพิ่มไปยังออบเจ็กต์ข้อผิดพลาดเป็นคุณลักษณะ validation
เพิ่มเติม หากต้องการค้นหาข้อผิดพลาดในการตรวจสอบ คุณควรตรวจสอบข้อผิดพลาดด้วย message
เท่ากับ 'validation'
จากนั้นแอตทริบิวต์ validation
จะมีข้อความแสดงข้อผิดพลาดปกติที่ส่งคืนโดย Laravel Validator
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}