Slide 1

Slide 1 text

ゼロから始める 型安全なGraphQL開発 with Laravel + Lighthouse + TypeScript 黒柳シャチ子 / 髙山 伶

Slide 2

Slide 2 text

・黒柳シャチ子 / 髙山 伶 (@shachi_daikon55) ・所属: ディップ株式会社 ・バイトルなどのWEBアプリ開発 / 3年目 ・PHP / TypeScript / AWS … 自己紹介

Slide 3

Slide 3 text

今日伝えたいこと

Slide 4

Slide 4 text

GraphQLを使った スキーマ駆動開発

Slide 5

Slide 5 text

めっちゃいいぞっ 👍

Slide 6

Slide 6 text

GraphQL使うなら Laravel + Lighthouse

Slide 7

Slide 7 text

めっちゃいいぞっ 👍

Slide 8

Slide 8 text

GraphQLでの型安全な 開発体験の良さを

Slide 9

Slide 9 text

ぜひ皆さんにも伝えたい!!

Slide 10

Slide 10 text

そんなLTです

Slide 11

Slide 11 text

まずは GraphQLおさらい

Slide 12

Slide 12 text

RESTの手法と 比較しながら説明

Slide 13

Slide 13 text

APIサーバー RESTの場合 クライアント “/users/1” エンドポイント毎に決め られた処理を実行

Slide 14

Slide 14 text

APIサーバー RESTの場合 クライアント “/users/1” しかしuser情報のうち ”name”しか必要としない場合 エンドポイント毎に決め られた処理を実行

Slide 15

Slide 15 text

APIサーバー RESTの場合 クライアント “/users/1” ここの取得データが余分 エンドポイント毎に決め られた処理を実行

Slide 16

Slide 16 text

APIサーバー RESTの場合 クライアント “/users/1” ここの取得データが余分 エンドポイント毎に決め られた処理を実行 リソースのオーバー・アンダーフェッチ

Slide 17

Slide 17 text

GraphQLの場合

Slide 18

Slide 18 text

APIサーバー クライアント “/graphql” エンドポイントは一つだけ 必要なデータ のみを クライアントが指定して取得 できる 取れたデータは ”name”だけ

Slide 19

Slide 19 text

どうやってクライアントは クエリを作るの?

Slide 20

Slide 20 text

GraphQLでは必ず スキーマと呼ばれる 型を伴ったデータリソースを定義 = I/F まずGraphQLで定義する スキーマ(I/F)を参照

Slide 21

Slide 21 text

まずGraphQLで定義する スキーマ(I/F)を参照

Slide 22

Slide 22 text

まずGraphQLで定義する スキーマ(I/F)を参照 この型の、

Slide 23

Slide 23 text

まずGraphQLで定義する スキーマ(I/F)を参照 このフィールドが欲しい

Slide 24

Slide 24 text

まずGraphQLで定義する スキーマ(I/F)を参照 User型はこの二つのクエリで提供されている

Slide 25

Slide 25 text

まずGraphQLで定義する スキーマ(I/F)を参照 User型はこの二つのクエリで提供されている このデータを取得するクエリは

Slide 26

Slide 26 text

このような形で組み上げられる

Slide 27

Slide 27 text

このような形で組み上げられる

Slide 28

Slide 28 text

APIサーバー クライアント 必要なデータ のみを クライアントが指定して取得 できる 取れたデータは ”name”だけ

Slide 29

Slide 29 text

APIサーバー クライアント 必要なデータ のみを クライアントが指定して取得 できる 取れたデータは ”name”だけ 必要なリソースを柔軟に指定できる オーバー・アンダーフェッチを防げる

Slide 30

Slide 30 text

APIサーバー クライアント 必要なデータ のみを クライアントが指定して取得 できる 取れたデータは ”name”だけ それが GraphQL

Slide 31

Slide 31 text

以上GraphQLの 前提知識おさらい

Slide 32

Slide 32 text

開発体験的に嬉しい点 (クライアント)

Slide 33

Slide 33 text

・ 欲しいデータを component毎に分けて記述できる ・生成ツールを使って、 GraphQLスキーマの型を クライアントでも利用できる 開発体験的に嬉しい点 (クライアント )

Slide 34

Slide 34 text

・ 欲しいデータを component毎に分けて記述できる ・生成ツールを使って、 GraphQLスキーマの型を クライアントでも利用できる 開発体験的に嬉しい点 (クライアント ) 簡単に型安全に開発できちゃう ✅

Slide 35

Slide 35 text

・ 欲しいデータを component毎に分けて記述できる ・生成ツールを使って、 GraphQLスキーマの型を クライアントでも利用できる 開発体験的に嬉しい点 (クライアント )

Slide 36

Slide 36 text

クエリするデータを component単位で記述する User詳細画面の componentたち UserName.tsx UserEmail.tsx

Slide 37

Slide 37 text

クエリするデータを component単位で記述する User詳細画面の componentたち UserName.tsx UserEmail.tsx 欲しい

Slide 38

Slide 38 text

じゃあUser詳細画面でまとめて取得してあげようか User 詳細画面の componentたち UserName.tsx UserEmail.tsx 分配

Slide 39

Slide 39 text

じゃあUser詳細画面でまとめて取得してあげようか User 詳細画面の componentたち UserName.tsx UserEmail.tsx 分配 ただこれ、

Slide 40

Slide 40 text

じゃあUser詳細画面でまとめて取得してあげようか User 詳細画面の componentたち UserName.tsx UserEmail.tsx 分配 親 component (page)が 子 component で必要なデータを 知ってなきゃいけない。。。

Slide 41

Slide 41 text

じゃあUser詳細画面でまとめて取得してあげようか User 詳細画面の componentたち UserName.tsx UserEmail.tsx 分配 もしcomponentの 必要なデータが変わった場合、

Slide 42

Slide 42 text

じゃあUser詳細画面でまとめて取得してあげようか User 詳細画面の componentたち UserName.tsx UserEmail.tsx 分配 そのcomponentを使っているすべての pageでクエリの書き換えが必要になる 🤨

Slide 43

Slide 43 text

そこで、

Slide 44

Slide 44 text

Fragment Colocation という仕組みを使用 UserName.tsx UserEmail.tsx component毎に 欲しいデータを定義

Slide 45

Slide 45 text

Fragment Colocation という仕組みを使用 UserName.tsx UserEmail.tsx 要は componentたちは 各々欲しいデータを自ファイル中で主張

Slide 46

Slide 46 text

分配 page側でそのFragment(主張)をまとめる

Slide 47

Slide 47 text

分配する時 pageは子の欲しいデータについて 関心を持たない 分配

Slide 48

Slide 48 text

分配する時 pageは子の欲しいデータについて 関心を持たない 分配 欲しいデータの情報が componentの中に閉じる

Slide 49

Slide 49 text

分配する時 pageは子の欲しいデータについて 関心を持たない 分配 バリ改修しやすい 👍

Slide 50

Slide 50 text

さらに、

Slide 51

Slide 51 text

・ 欲しいデータを component毎に分けて記述できる ・生成ツールを使って、 GraphQLスキーマの型を クライアントでも利用できる 実際の開発体制での嬉しみ (クライアント )

Slide 52

Slide 52 text

GraphQL codegen で GraphQLクエリの型を TypeScriptで使う

Slide 53

Slide 53 text

UserName.tsx UserEmail.tsx GraphQL codegenを使うと

Slide 54

Slide 54 text

UserName.tsx UserEmail.tsx Fragmentやクエリを元に GraphQLから型を自動生成してくれる Fragmentを元に、 型を自動生成 Fragmentを元に、 型を自動生成

Slide 55

Slide 55 text

このFragmentと 型の自動生成を組み合わせると

Slide 56

Slide 56 text

もし必要なデータに 変更があったとしても User詳細画面の componentたち UserName.tsx UserEmail.tsx 欲しい 追加で 欲しい

Slide 57

Slide 57 text

componentの Fragmentを追記して UserEmail.tsx 追記

Slide 58

Slide 58 text

codegenの型生成コマンド を実行するだけで

Slide 59

Slide 59 text

APIのデータ取得内容を変えられちゃう! 分配 追加取得 できちゃう

Slide 60

Slide 60 text

それだけで APIのデータ取得内容を変えられちゃう! 分配 追加取得 できちゃう 型のエラーも起きません ✅ API連携での余計な型エラーとは おさらば

Slide 61

Slide 61 text

それだけで APIのデータ取得内容を変えられちゃう! 分配 追加取得 できちゃう 超簡単に型安全に APIと連携できちゃう ✅

Slide 62

Slide 62 text

クライアント側はわかったけど サーバー側は難しいのでは?

Slide 63

Slide 63 text

APIサーバー RESTの場合 クライアント “/users/1” エンドポイント毎に決め られた処理を実行 “/posts” 処理1 処理2

Slide 64

Slide 64 text

GraphQLの場合

Slide 65

Slide 65 text

APIサーバー クライアントが何かは あんまり関係ない スキーマのフィールド毎に 決められた処理を実行 ・・・

Slide 66

Slide 66 text

APIサーバー クライアントが何かは あんまり関係ない スキーマのフィールド毎に 決められた処理を実行 ・・・ めんどくさそう ?

Slide 67

Slide 67 text

APIサーバー クライアントが何かは あんまり関係ない スキーマのフィールド毎に 決められた処理を実行 ・・・ 大丈夫ですよ 😏

Slide 68

Slide 68 text

Lighthouseが あるからねぇ!

Slide 69

Slide 69 text

Lighthouse Laravelフレンドリーな GraphQL FW https://lighthouse-php.com/

Slide 70

Slide 70 text

Lighthouse APIサーバー Lighthouseのサーバーに スキーマを設置して動作 ・・・

Slide 71

Slide 71 text

スキーマに直説解決処理を記載していく ・・・ Lighthouse APIサーバー

Slide 72

Slide 72 text

Lighthouseの強力なスキーマ解決能力 ・ モデル・カラムと名前が一致するスキーマは デフォルトでその値を返してくれる ・ディレクティブ と呼ばれる使い回しの効く備え 付けのスキーマ解決処理が豊富 ・複雑なスキーマの解決は、リゾルバー にまと められる

Slide 73

Slide 73 text

先ほどのUser型 の実装を考える

Slide 74

Slide 74 text

これが

Slide 75

Slide 75 text

こう!

Slide 76

Slide 76 text

ディレクティブ を使えばシンプルに Lighthouse備え付けの ディレクティブ リレーション id引数一致のUserモデ ルを取得

Slide 77

Slide 77 text

ディレクティブが ついてないものは自動解決 Userモデルのid, name, emailのカラム値を取得

Slide 78

Slide 78 text

APIサーバー Lighthouseのおかげで 少ない処理 で多くのフィールドを解決 ・・・

Slide 79

Slide 79 text

APIサーバー Lighthouseのおかげで 少ない処理 で多くのフィールドを解決 ・・・ 👍 手軽に始められる 👍 ディレクティブのおかげで記述量少なく済む 👍 スキーマファーストなので、 スキーマ駆動開発しやすい

Slide 80

Slide 80 text

APIサーバー Lighthouseのおかげで 少ない処理 で多くのフィールドを解決 ・・・ PHPerの皆さん LighthouseでGraphQL 触り始めてはいかがでしょう?

Slide 81

Slide 81 text

APIサーバー Lighthouseのおかげで 少ない処理 で多くのフィールドを解決 ・・・ 触りましょうよ!!!!

Slide 82

Slide 82 text

いかがだったでしょうか

Slide 83

Slide 83 text

「なんかよくわからないけど、 面白そうだ!」

Slide 84

Slide 84 text

そう思っていただけたら 幸いです🙏

Slide 85

Slide 85 text

まとめ ・ GraphQL + TypeScriptは、すごく簡単に型 安全なAPI連携ができる ・Laravel + Lighthouseはスキーマの解決が 楽。記述量が少なく済む。 ・GraphQLの開発は一度仕組みを整えると改 修がほんとにしやすい

Slide 86

Slide 86 text

カジュアル面談やってます! https://hrmos.co/pages/dip-net/jobs/phperkaigi-dip

Slide 87

Slide 87 text

ご清聴ありがとうございました!