將 Facebook GraphQL 與 Laravel 5 或 Lumen 結合使用。它是基於 PHP 實現的。您可以在 React 部落格上的 GraphQL 簡介中找到有關 GraphQL 的更多信息,也可以閱讀 GraphQL 規範。這是一項正在進行的工作。
該套件與 Eloquent 模型(或任何其他資料來源)相容。請參閱下面的範例。
1.0版本發布。如果您要從舊版本升級,可以選取升級至 1.0。
1-在您的composer.json
中透過Composer 需要該套件。
{
"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 '
],
// ...
]
]
就是這樣。您應該能夠透過對 url /graphql
(或您在組態中選擇的任何內容)的請求來查詢 GraphQL。嘗試使用以下query
輸入發出 GET 請求
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 ;
}
}
或者,您可以使用每個參數定義規則
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 驗證器傳回的正常錯誤訊息。
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}