Upgrade to Pro — share decks privately, control downloads, hide ads and more …

php conference okinawa 2022

php conference okinawa 2022

PHP Conference 沖縄 2022 の登壇資料です

ふわせぐ

August 27, 2022
Tweet

More Decks by ふわせぐ

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. $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





    View full-size slide

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

    View full-size slide

  32. 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!実績作りにもってこい

    View full-size slide

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

    View full-size slide

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

    View full-size slide