こんにちは。ソフトウェアエンジニアのやぎーです。
4Kモニタを購入してみたのですが、想像以上に文字が見やすくて疲れにくいです。
PCで文字を見る時間が長い方には4Kおすすめします。
さて、最近LaravelでGraphQLを触る機会がありましたので、簡単にご紹介させていただきます。
ざっくり環境
- PHP 7系
- Laravel 5系
- Lighthouse 5系
GraphQLとは
- APIのクエリ言語で、データ用に定義した型システムを使用してクエリを実行するためのサーバー側ランタイム
- クライアントとサーバー間のデータのやり取りを容易に記述できる
Lighthouseとは
LaravelでGraphQLが簡単に利用できるライブラリ
こんな人におすすめ
導入方法
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の画面はこんな感じ。
スキーマの確認や、クエリの実行ができます。
書き方
インストールが完了すると、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をベースのキャッシュができないため方法を検討する必要がある
まとめ
とても大雑把な紹介にはなってしまいましたが、使ってみた感じ非常に好感触です。 学習コストも少なく、柔軟性にも優れていると感じました。
実際のスキーマに関してあまり記載はしませんでしたが、公式のリファレンスがわかりやすいので参照してみてください。
もちろん用途によって向き不向きはあるかと思いますので、無理に導入する必要はありません。
実際に使ってみるのが一番わかりやすいと思うので、興味を持っていただけたらぜひお試しください。
最後まで読んでいただきありがとうございました!
\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //