Lighthouseと遊ぶ
artisanコマンドでデフォルトのスキーマを作成する
artisanコマンドでconfを作成する
設定を読む
エンドポイントはexample.com/graphql
GETは許される
middlewareの設定
デフォルトはなにもない
middlewareはGraphQLが実行される前に適用されるので、エラーが起こるとすべてのクエリが中止され、specに従わないレスポンスが返る
スキーマの単一フィールドにmiddlewareを足すのを宣言するのに使うのが良い
スキーマ定義はroutes/graphql/schema.graphql。ここにすべてのGraphQLのスキーマを書く(importする)
スキーマのキャッシュ
デフォルトfalse
スキーマ生成の大部分はASTにパースする部分なので、本番ではtrueにするのがおすすめ カスタムserver-side directiveのためにスキャンされるディレクトリはapp/Http/GraphQL/Directives
queryのvalidation
デフォルトではなにもvalidationしない
depthやcomplexityを設定できる
Debug
Laravelのdebugがtrueのときに設定されるオプション
query batchngの可否
query batchingは複数のクエリを1度のリクエストでサーバに送ること
Tutorial
GraphQLのendpointをLaravel appでserveするためのパッケージ
GraphQL serverを持ちたいなら次の3stepをふむ
1. SDLでデータの形を定義する
2. pre-build directiveを使ってスキーマをファイルにする
3. 必要なところでcustom functionalityをつかってLighthouseを拡張する
Installation
user has many posts has many comments の例
Next Step
ページネーション
postとcommentsをcreate/update
サーバへの入力のバリデーション
疑問
client側のTypeScriptの型定義を自動ではきだせないの?
既存のREST APIとどうintegrationするの?
resolverは常に4つの引数を渡される
($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
親のフィールドから返った結果
root type(Query, Mutation)のfieldを解決するときにはnull
フィールドに渡された引数
user(name: "Bob")というクエリなら['name'=>'Bob']になる
単一のクエリにおける全てのフィールドで共有される任意のdata。デフォルトではNuwave\Lighthouse\Schema\Contextが渡される
qurery自身の情報。実行状態、field名、rootからのfieldへのpathなど
resolverをどこに置くか
resolverの命名規則
By default, Lighthouse looks for a class with the capitalized name of the field in App\Http\GraphQL\Queries or App\Http\GraphQL\Mutations and calls its resolve function with the usual resolver arguments.
デフォルトの名前空間が一つしか指定できなくて困る
できるようにするPRもmergeされている
現行のv2.6.4にはまだはいっていない
Showing 433 changed files with 29,324 additions and 8,012 deletions.
v3でそう
Object Type
Union型
Interface
Queryで個別の要素を(RESTでいう GET users/1)どうやって指定するの?
@eqディレクティブを使う
eq(key: "hoge")で実際のテーブルの名前を指定できる(指定するキー名をCamelにしたいけどテーブルはsnake_caseみたいなときにつかう)
要素のpaginationはどうするの?
code:_
{
user(id: $id){
posts { // この数を制約したい場合にはどうすればいいのか?
text
}
}
}
A. @pagenate directiveを使う
GraphQLのエンドポイントがhomesteadにあり、clientのCRAをlocalhost:3000からリクエストを送りたいが、CORSで叩けない
@orderByみたいなEloquentの戻り値の順序を制御するディレクティブ欲しい
paginationしているときに順序を変更したい
ユーザ定義のtypeを多重に使っている場合にresolverをどうかけばいいの?
例えば以下のようなtypeがあったとして、FooのResolverを書くときにBarの解決も書かなければいけないのか?
Barのresolverを書いて使うことはできないのか?
code:_
Query Foo{
id: ID!
baz: Bar!
}
type Bar {
id: ID!
baz: Baz!
type Baz {
}
rootValueを使う?
Barを返すときにEloquent Modelなら自動的にフィールドを解決してくれる
用語
root type
QueryやMutationのことらしい