Slide 1

Slide 1 text

๻͕ *MVNJOBUF ΛಡΉཧ༝ ふわせぐ @fuwasegu

Slide 2

Slide 2 text

2 PHP Conference Okinawa 2022 • ふわせぐ (@fuwasegu) • 株式会社ゆめみ / 21卒 – コーポレートエンジニア • PHP / Laravel がメイン – Svelte(JS / TS),Rust 勉強中 自己紹介

Slide 3

Slide 3 text

3 PHP Conference Okinawa 2022 今日伝えたいこと ੒௕͚ͨ͠Ε͹࣮૷ΛಡΉ΂͠ʂ

Slide 4

Slide 4 text

4 PHP Conference Okinawa 2022 -BSBWFM ͷίʔυಡΜͰ·͔͢ʁ 🙅 Laravel で書かれたアプリケーションのコード 🙆 Laravel フレームワーク本体(Illuminate)のコード

Slide 5

Slide 5 text

5 Laravel の本体 “Illuminate” PHP Conference Okinawa 2022 https://github.com/illuminate

Slide 6

Slide 6 text

• メソッドが発掘できる – マニュアルには載ってないけど便利なメソッドがあ るかも • フレームワーク の仕様が深いところまで分かる – エラーの原因が推測しやすくなる 6 僕が Illuminate を読む理由 PHP Conference Okinawa 2022

Slide 7

Slide 7 text

• メソッドが発掘できる – マニュアルには載ってないけど便利なメソッドがあ るかも 7 僕が Illuminate を読む理由 PHP Conference Okinawa 2022

Slide 8

Slide 8 text

8 おなじみ Laravel ReaDouble PHP Conference Okinawa 2022 https://readouble.com/ • Laravel の公式マニュアル (laravel.com)の翻訳サイト • 恐らく日本の Laravel エンジニア が一番お世話になっているであろ う有名サイト

Slide 9

Slide 9 text

9 メソッドが発掘できる PHP Conference Okinawa 2022 Laravel7.x 以前で Http ファサードを用いた複数のリクエストを順序を含めて検証する • 実装を紐解きながら裏技を紹 介する記事 • ソースコードリーディングで 見つけたメソッドで問題を解 決した • メソッドの発掘は宝探しみた いで楽しい! https://zenn.dev/fuwasegu/articles/728061dbaf7082

Slide 10

Slide 10 text

• フレームワーク の仕様が深いところまで分かる – エラーの原因が推測しやすくなる 10 僕が Illuminate を読む理由 PHP Conference Okinawa 2022

Slide 11

Slide 11 text

11 何が渡ってくるかぱっと見分からない PHP Conference Okinawa 2022 https://readouble.com/laravel/8.x/ja/eloquent-relationships.html

Slide 12

Slide 12 text

12 ιʔείʔυΛಡΜͰղ໌ͯ͠ΈΑ͏ʂ PHP Conference Okinawa 2022

Slide 13

Slide 13 text

13 宣伝 PHP Conference Okinawa 2022 -BSBWFM ιʔείʔυϦʔσΟϯάษڧձ ݄த०ΑΓ DPOOQBTT ʹͯఆظ։࠵ܾఆʂ

Slide 14

Slide 14 text

詳しい処理の解説は勉強会でいつかやるの で,今回は時間の関係で軽く処理を追って いくだけにしようと思います 14 PHP Conference Okinawa 2022

Slide 15

Slide 15 text

• $query に何が渡ってくるのかを突き止める – with に渡されたクロージャを実行している部分を見 つければよさそう 15 今回のコードリーディングのゴール PHP Conference Okinawa 2022

Slide 16

Slide 16 text

User::with() の呼び出し部分 PHP Conference Okinawa 2022 16 地上1階

Slide 17

Slide 17 text

Eloquent Model::with() PHP Conference Okinawa 2022 17 今回の $relations は array 地下1階

Slide 18

Slide 18 text

Eloquent Builder::with() PHP Conference Okinawa 2022 18 今回の $callback は null 地下2階

Slide 19

Slide 19 text

Eloquent Builder::parseWithRelations() PHP Conference Okinawa 2022 19 $relations は,[‘posts’ => function ($query)] ここには入らない 地下3階 ドットでネストしたリレーションを処理

Slide 20

Slide 20 text

Eloquent Builder::with() PHP Conference Okinawa 2022 20 $eagerLoad は,[‘posts’ => function ($query)] 地下2階 $this->eagerLoad に [‘posts’ => function ($query)] をマージ

Slide 21

Slide 21 text

Eloquent Model::with() PHP Conference Okinawa 2022 21 地下1階

Slide 22

Slide 22 text

User::with() の呼び出し部分 PHP Conference Okinawa 2022 22 地上1階 次はこっち

Slide 23

Slide 23 text

Eloquent Builder::get() PHP Conference Okinawa 2022 23 地下1階 一旦リレーション無しでモデルを取得(SELECT) 今回はモデルが取れる想定

Slide 24

Slide 24 text

Eloquent Builder::eagerLoadRelations() PHP Conference Okinawa 2022 24 地下2階 さっき [‘posts’ => function ($query)] をマージしたやつ

Slide 25

Slide 25 text

Eloquent Builder::eagerLoadRelation() PHP Conference Okinawa 2022 25 地下3階 ついに実行している部分を発見!!! function ($query) の $query は, $constraints($relation) の $relation $relation の型がわかれば良さそう

Slide 26

Slide 26 text

Eloquent Builder::getRelation() PHP Conference Okinawa 2022 26 地下4階 $this->getModel() ->newInstance() ->$name() で,User モデルの を呼んでる

Slide 27

Slide 27 text

Eloquent Relations Relation::noConstraints() PHP Conference Okinawa 2022 27 地下5階 そのままクロージャを実行して結果を 返却

Slide 28

Slide 28 text

Eloquent Builder::getRelation() PHP Conference Okinawa 2022 28 地下4階 $relation には posts() の返り値 HasMany が入っていそう

Slide 29

Slide 29 text

Eloquent Builder::eagerLoadRelation() PHP Conference Okinawa 2022 29 地下3階 $relation の型が HasMany に決定!

Slide 30

Slide 30 text

$query の正体(今回の場合) • Illuminate/Database/Eloquent/Relations/HasMany – 今回渡される実体 • Illuminate/Database/Eloquent/Relations/HasOneOrMany – HasMany の継承元(抽象クラス) • Illuminate/Database/Eloquent/Relations/Relation – HasOneOrMany の継承元(抽象クラス) • Illuminate/Contracts/Database/Eloquent/Builder – Relation が実装しているインターフェース PHP Conference Okinawa 2022 30 抽 象 度 高 低

Slide 31

Slide 31 text

Laravel にちょっと詳しいヤツになれた! PHP Conference Okinawa 2022 31 Model::with() にわたすクロージャの引数 に何が渡ってくんのか全然分からん!

Slide 32

Slide 32 text

32 (おまけ)その他のメリット PHP Conference Okinawa 2022 mockery/library/Mockery/Container.php • 作者からのメッセージが残さ れていることも...? I'll refactor it one day so it's easier to follow. いつか分かりやすくリファクタするよ ー Padraic Brady • OSS 貢献チャンス – コメントの修正レベルでも OK!実績作りにもってこい

Slide 33

Slide 33 text

• フレームワークのソースコードリーディングには メリットが沢山 – メソッドの発掘 – フレームワークの深い理解 – OSS への貢献チャンス • ソースコードリーディングは成長への近道 – 初心者こそ,ツヨツヨに一歩近づくためにソースコ ードリーディングをして欲しい 33 まとめ PHP Conference Okinawa 2022

Slide 34

Slide 34 text

34 PHP Conference Okinawa 2022 -BSBWFM ͷίʔυΛಡ΋͏ʂ