株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

LaravelでGraphQLを使ってみた

こんにちは。ソフトウェアエンジニアのやぎーです。

4Kモニタを購入してみたのですが、想像以上に文字が見やすくて疲れにくいです。
PCで文字を見る時間が長い方には4Kおすすめします。

さて、最近LaravelでGraphQLを触る機会がありましたので、簡単にご紹介させていただきます。

ざっくり環境

  • PHP 7系
  • Laravel 5系
  • Lighthouse 5系

GraphQLとは

  • APIのクエリ言語で、データ用に定義した型システムを使用してクエリを実行するためのサーバー側ランタイム
  • クライアントとサーバー間のデータのやり取りを容易に記述できる

graphql.org

Lighthouseとは

LaravelでGraphQLが簡単に利用できるライブラリ f:id:aimstogeek:20210407181407p:plain

lighthouse-php.com

こんな人におすすめ

  • RESTful APIでエンドポイントの管理が限界
  • なるべくオーバーフェッチを減らしたい
  • 必要なデータを揃えるために、複数のAPIリクエストが必要になっている

導入方法

Laravelを使っている環境があればとても簡単に導入できます。

# Lighthouseをインストール
composer require nuwave/lighthouse

# 初期設定
php artisan vendor:publish --tag=lighthouse-schema

DevToolsを使いたい場合は下記もどうぞ。

# /graphql-playgroundで直接クエリを実行できる
composer require mll-lab/laravel-graphql-playground

スタンドアロン版もあるようです。 www.electronjs.org

DevToolsの画面はこんな感じ。 f:id:aimstogeek:20210407101415p:plain

スキーマの確認や、クエリの実行ができます。

書き方

インストールが完了すると、graphql/schema.graphqlというファイルが生成されます。 ここにスキーマを記述していくのですが、スキーマが膨らむ場合には下記のように分割が可能です。

# graphql/schema.graphql

# 追加
#import **/*.graphql

スカラー

5つのスカラー型が存在します。

  • String(文字列型)
  • Int(整数型)
  • Float(浮動小数点型)
  • Boolean(論理型)
  • ID(ID型)

ルート型

データソースに対する操作を表現する型。

  • Query
# データの取得

type Query {
  me: User
  users: [User!]!
  userById(id: ID): User
}
  • Mutation
# データの登録・更新・削除

type Mutation {
  createUser(name: String!, email: String!, password: String!): User
  updateUser(id: ID, email: String, password: String): User
  deleteUser(id: ID): User
}
  • Subscription
# websocket

type Subscription {
  newUser: User
}

オブジェクト型

1つ以上のスキーマで定義されているフィールドの集合。

# 例
type User {
  id: ID!
  name: String!
  posts: [Post!]!
}

type Post {
  title: String!
  author: User!
}

ディレクティブの種類

紹介し切れないくらいあるので、公式リファレンスを参照ください。 lighthouse-php.com

Resolver

特定のフィールドのデータを返す関数(サーバーサイド) 独自に実装することもでき、スキーマに実行したいResolverを指定できる。

# こんなかんじ
type Mutation {
  createPost(title: String!): Post
    @field(resolver: "App\\GraphQL\\Mutations\\PostMutator@create")
}

ここがいい

  • リクエストをまとめられる

    • 一度に複数のresolverに対してqueryを送れるため、必要な情報をまとめて取得できる
  • Eloquentモデルをそのまま利用できる

    • Eloquentモデルで定義してあるリレーションなどをスキーマ側で指定して利用することができる

      • リレーション(hasMany/belongsTo等)
      • 認証
      • ページネーション
      • バリデーション etc...
  • 導入しやすい

    • Lighthouse使えばGraphQLの導入がとても簡単
  • エンドポイントがひとつ

    • RESTと違ってエンドポイントが共通のため管理がしやすい
  • バージョン管理しなくていい

    • クライアントで必要な情報を要求できるため、fieldの削除などをしなければ破壊的な変更になりにくい
  • ジェネレータでコードを自動生成できる

    • graphql-codegenを利用すればGraphQLのschema定義からTypeScriptの型定義を生成できる

ここがよくない

  • パフォーマンス計測がしづらい

    • エンドポイントが同じため、細かい分析がしづらい
  • キャッシュがしづらい

    • RESTと違い、URLをベースのキャッシュができないため方法を検討する必要がある

まとめ

とても大雑把な紹介にはなってしまいましたが、使ってみた感じ非常に好感触です。 学習コストも少なく、柔軟性にも優れていると感じました。

実際のスキーマに関してあまり記載はしませんでしたが、公式のリファレンスがわかりやすいので参照してみてください。

もちろん用途によって向き不向きはあるかと思いますので、無理に導入する必要はありません。

実際に使ってみるのが一番わかりやすいと思うので、興味を持っていただけたらぜひお試しください。

最後まで読んでいただきありがとうございました!


\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //

919.jp