Laravel 5 または Lumen で Facebook GraphQL を使用します。ここでは PHP 実装に基づいています。 GraphQL の詳細については、React ブログの GraphQL Introduction を参照するか、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
}
}
たとえば、homestead を使用する場合:
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
属性としてエラー オブジェクトに追加されます。検証エラーを見つけるには、 'validation'
に等しいmessage
でエラーをチェックする必要があります。その後、 validation
属性には、Laravel Validator によって返される通常のエラー メッセージが含まれます。
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}