PHPではLaravel Lighthouseを使うことで簡単にGraphQLのサーバを構築することができます。
今回はPHP8.1、Laravel9、Laravel Lighthouse5を使ってGraphQLのQueryを返すことができる簡単なサーバを構築する手順を説明します。
結果は、Eloquentのモデルとと紐付けするのではなく、PHPでディレクティブのクラス(=通常のLaravelだとControllerに相当するもの)を用意する形で実装します。
環境
今回は下記のバージョンの環境で動作確認します
$ sw_vers
ProductName: macOS
ProductVersion: 12.3
BuildVersion: 21E230
$php -v
PHP 8.1.5 (cli) (built: Apr 16 2022 00:14:18) (NTS)
$php artisan --version
Laravel Framework 9.10.1
$composer show nuwave/lighthouse
name : nuwave/lighthouse
descrip. : A framework for serving GraphQL from Laravel
keywords : graphql, laravel, laravel-graphql
versions : * v5.48.2
laravelのインストール
今回はlaravelコマンドでインストールします(Laravel Sail
に慣れていたらsailを使ってもOKです)
laravel new graphql-test01
インストールしたら、サーバを起動しておきます
cd graphql-test01
php artisan serve
Lighthouseのインストール
下記のコマンド3つでLighthouseのインストールは完了です。
2つ目のコマンドはgraphql/schema.graphql
の雛形を作るだけなので、雛形が不要ならコマンドを実行しなくて良いです。
3つ目は動作確認用のGraphQL Playgroundをインストールしています。GraphQLに慣れていて他のクライアントソフトを使える場合、これはなくても良いです。
# Laravel Lighthouseのインストール
composer require nuwave/lighthouse
# デフォルトのGraphQLスキーマをコピー
php artisan vendor:publish --tag=lighthouse-schema
# GraphQL playgroundのインストール
composer require mll-lab/laravel-graphql-playground
GraphQLのクエリ定義を作る
上記のvendor:publish
でgraphql/schema.graphql
ファイルが作成されます。スキーマのサンプルを下記の内容で置き換えます。
type Query {
HelloMessage(
name: String!
): Message! @field(resolver: "HelloMessageResolver")
}
type Message {
message: String!
}
4行目で、このクエリに対するリゾルバ(=Controller)をHelloMessageResolver
の名前で定義しています。このphpファイルはこのあと作ります。
クエリ用のリゾルバ雛形を用意
artisanコマンドでリゾルバHelloMessageResolver
を作成します。
php artisan lighthouse:query HelloMessageResolver
ファイルは、app/GraphQL/Queries/HelloMessageResolver.php
のパスで作成されます。
作った雛形を修正する
作成された雛形をもとに、ロジックを作ります。クエリの定義では引数がname
で、戻り値がmessage
だったのでこれを処理します。
app/GraphQL/Queries/HelloMessageResolver.php
<?php
namespace App\GraphQL\Queries;
final class HelloMessageResolver
{
/**
* @param null $_
* @param array{} $args
*/
public function __invoke($_, array $args)
{
$message = "hello {$args['name']}";
return [
'message' => $message,
];
}
}
GraphQL Playgroundからクエリを実行
ブラウザからhttp://localhost:8000/graphql-playground
にアクセスします。
画面左に下記のクエリを指定して、実行ボタンをクリックします。
{
HelloMessage(name: "alice") {
message
}
}
すると、下記の結果が出力されます。
{
"data": {
"HelloMessage": {
"message": "hello alice"
}
}
}
curlからクエリを実行
次はcurlからクエリ実行します。
curlコマンドの実行で...
curl 'http://localhost:8000/graphql' \
-H 'content-type: application/json' \
-s \
--data-raw '{ "query":"{ HelloMessage(name: \"alice\") { message }}"}' | jq
以下の結果が帰ってこれば成功です!
{
"data": {
"HelloMessage": {
"message": "hello alice"
}
}
}