Laravel LighthouseをインストールしてPHPからクエリを返す

カテゴリ: 未分類 | タグ: , , ,

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:publishgraphql/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"
    }
  }
}

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です