PHP Conference 沖縄 2022 の登壇資料です
͕ *MVNJOBUF ΛಡΉཧ༝ふわせぐ @fuwasegu
View Slide
2PHP Conference Okinawa 2022• ふわせぐ (@fuwasegu)• 株式会社ゆめみ / 21卒– コーポレートエンジニア• PHP / Laravel がメイン– Svelte(JS / TS),Rust 勉強中自己紹介
3PHP Conference Okinawa 2022今日伝えたいこと͚ͨ͠Ε࣮ΛಡΉ͠ʂ
4PHP Conference Okinawa 2022-BSBWFM ͷίʔυಡΜͰ·͔͢ʁ🙅 Laravel で書かれたアプリケーションのコード🙆 Laravel フレームワーク本体(Illuminate)のコード
5Laravel の本体 “Illuminate”PHP Conference Okinawa 2022https://github.com/illuminate
• メソッドが発掘できる– マニュアルには載ってないけど便利なメソッドがあるかも• フレームワーク の仕様が深いところまで分かる– エラーの原因が推測しやすくなる6僕が Illuminate を読む理由PHP Conference Okinawa 2022
• メソッドが発掘できる– マニュアルには載ってないけど便利なメソッドがあるかも7僕が Illuminate を読む理由PHP Conference Okinawa 2022
8おなじみ Laravel ReaDoublePHP Conference Okinawa 2022https://readouble.com/• Laravel の公式マニュアル(laravel.com)の翻訳サイト• 恐らく日本の Laravel エンジニアが一番お世話になっているであろう有名サイト
9メソッドが発掘できるPHP Conference Okinawa 2022Laravel7.x 以前で Http ファサードを用いた複数のリクエストを順序を含めて検証する• 実装を紐解きながら裏技を紹介する記事• ソースコードリーディングで見つけたメソッドで問題を解決した• メソッドの発掘は宝探しみたいで楽しい!https://zenn.dev/fuwasegu/articles/728061dbaf7082
• フレームワーク の仕様が深いところまで分かる– エラーの原因が推測しやすくなる10僕が Illuminate を読む理由PHP Conference Okinawa 2022
11何が渡ってくるかぱっと見分からないPHP Conference Okinawa 2022https://readouble.com/laravel/8.x/ja/eloquent-relationships.html
12ιʔείʔυΛಡΜͰղ໌ͯ͠ΈΑ͏ʂPHP Conference Okinawa 2022
13宣伝PHP Conference Okinawa 2022-BSBWFM ιʔείʔυϦʔσΟϯάษڧձ݄த०ΑΓ DPOOQBTT ʹͯఆظ։࠵ܾఆʂ
詳しい処理の解説は勉強会でいつかやるので,今回は時間の関係で軽く処理を追っていくだけにしようと思います14PHP Conference Okinawa 2022
• $query に何が渡ってくるのかを突き止める– with に渡されたクロージャを実行している部分を見つければよさそう15今回のコードリーディングのゴールPHP Conference Okinawa 2022
User::with() の呼び出し部分PHP Conference Okinawa 2022 16地上1階
Eloquent Model::with()PHP Conference Okinawa 2022 17今回の $relations は array地下1階
Eloquent Builder::with()PHP Conference Okinawa 2022 18今回の $callback は null地下2階
Eloquent Builder::parseWithRelations()PHP Conference Okinawa 2022 19$relations は,[‘posts’ => function ($query)]ここには入らない地下3階ドットでネストしたリレーションを処理
Eloquent Builder::with()PHP Conference Okinawa 2022 20$eagerLoad は,[‘posts’ => function ($query)]地下2階$this->eagerLoad に [‘posts’ => function ($query)] をマージ
Eloquent Model::with()PHP Conference Okinawa 2022 21地下1階
User::with() の呼び出し部分PHP Conference Okinawa 2022 22地上1階次はこっち
Eloquent Builder::get()PHP Conference Okinawa 2022 23地下1階一旦リレーション無しでモデルを取得(SELECT)今回はモデルが取れる想定
Eloquent Builder::eagerLoadRelations()PHP Conference Okinawa 2022 24地下2階さっき [‘posts’ => function ($query)] をマージしたやつ
Eloquent Builder::eagerLoadRelation()PHP Conference Okinawa 2022 25地下3階ついに実行している部分を発見!!!function ($query) の $query は,$constraints($relation) の $relation$relation の型がわかれば良さそう
Eloquent Builder::getRelation()PHP Conference Okinawa 2022 26地下4階$this->getModel()->newInstance()->$name()で,User モデルのを呼んでる
Eloquent Relations Relation::noConstraints()PHP Conference Okinawa 2022 27地下5階そのままクロージャを実行して結果を返却
Eloquent Builder::getRelation()PHP Conference Okinawa 2022 28地下4階$relation には posts() の返り値 HasManyが入っていそう
Eloquent Builder::eagerLoadRelation()PHP Conference Okinawa 2022 29地下3階$relation の型が HasMany に決定!
$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抽象度高低
Laravel にちょっと詳しいヤツになれた!PHP Conference Okinawa 2022 31Model::with() にわたすクロージャの引数に何が渡ってくんのか全然分からん!
32(おまけ)その他のメリットPHP Conference Okinawa 2022mockery/library/Mockery/Container.php• 作者からのメッセージが残されていることも...?I'll refactor it one day so it's easier to follow.いつか分かりやすくリファクタするよー Padraic Brady• OSS 貢献チャンス– コメントの修正レベルでも OK!実績作りにもってこい
• フレームワークのソースコードリーディングにはメリットが沢山– メソッドの発掘– フレームワークの深い理解– OSS への貢献チャンス• ソースコードリーディングは成長への近道– 初心者こそ,ツヨツヨに一歩近づくためにソースコードリーディングをして欲しい33まとめPHP Conference Okinawa 2022
34PHP Conference Okinawa 2022-BSBWFM ͷίʔυΛಡ͏ʂ