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

初めましてLaravel、君のことを教えてくれ! 〜春に就職したばかりの新卒エンジニアが調べた内部仕様と、そのプロセス〜

amixedcolor
September 16, 2023

初めましてLaravel、君のことを教えてくれ! 〜春に就職したばかりの新卒エンジニアが調べた内部仕様と、そのプロセス〜

phpcon沖縄2022での、TRACK B 15:00-15:30の発表です。

https://phpcon.okinawa.jp/
https://phpcon-okinawa.connpass.com/event/291775/

以下、プロポーザルの転記です。

このトークは、新卒エンジニアの情熱と探求心が燃え上がる瞬間を共有する場です!私がLaravelの内部仕様を探求し、その果てに見えた知識と洞察をお伝えします。

LaravelもPHPも初めてな私が、その世界に足を踏み入れてから早数ヶ月が経ちました。その間、Laravelの内部仕様に私は常に興味津々で、「単に使うだけでなく、Laravelがどのように動いているのかを理解しながら活用したい!」そう考えていました。様々な内部仕様について調べたそのプロセス・結果・知見を交えて、聴衆の皆さんに刺激を届けます!

新卒エンジニアならではの視点から、Laravelを通した私の情熱と成長のストーリーをお伝えしつつ、具体的な内部仕様を複数取り上げ、それについて熱く解説します!
このトークを通じて、皆さんと共に学び、成長し、Laravelの魅力を深く探求する喜びを共有できることを心から楽しみにしています!

amixedcolor

September 16, 2023
Tweet

More Decks by amixedcolor

Other Decks in Programming

Transcript

  1. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 21 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週)
  2. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 22 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて
  3. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 23 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上
  4. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 24 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺
  5. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 25 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上
  6. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 26 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上 7. app関数・makeメソッド・各種ヘルパー関数
  7. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 27 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上 7. app関数・makeメソッド・各種ヘルパー関数 ←配属3ヶ月目
  8. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 28 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上 7. app関数・makeメソッド・各種ヘルパー関数 ←配属3ヶ月目
  9. ©amixedcolor BUSINESS Relicでは大きく 3つの事業 で 日本企業の新規事業開発やイノベーション創出を支援していま す オープンイノベーション 新規事業に投資/協業 Relicも当事者となり、事業パートナー

    とともに新規事業を共創する 新規事業支援に特化した SaaS型プラットフォーム / プロダクトの提供 インキュベーションテック 新規事業特化のSaaS型プロダクト 独自の新規事業ノウハウを活用した 伴走型の事業コンサルティング 新規事業に関する課題を解決/支援 事業プロデュース
  10. ©amixedcolor ͜Μͳ͜ͱΛ͖ͯͨ͠ͻͱ 34 อཾࣇʢΤΠϛBNJYFEDPMPSʣ ϓϩμΫτσΟϕϩοϓϝϯτࣄۀ෦ ΤϯδχΞ ౦ژ౎ཱࠃࡍߴ౳ֶߍଔۀޙɺஜ೾େֶ৘ใֶ܈৘ใՊֶྨʹೖֶ͠೥݄ʹଔۀɻ ಉ݄ʹ3FMJDʹ৽ଔͱͯ͠ೖࣾɻݱࡏ͸όοΫΤϯυΤϯδχΞͱͯ͠׆༂ɻֶੜ࣌୅ʹ ͸ɺஜ೾େֶͰFO1J5ͱݺ͹ΕΔतۀͰΞδϟΠϧ։ൃΛֶͼɺνʔϜ։ൃΛ࣮ફɻ೥࣍ ʹ͸௨೥ͰಉतۀΛडߨɺ৆Λड৆ɻֶۀͱฒߦͯ͠ɺίϛϡχςΟ׆ಈʹੵۃతʹࢀՃ

    ͠ɺ೥݄ʹ%BW0QT%BZT 5PLZPʹͯϘϥϯςΟΞελοϑɺಉ݄ʹεΫϑϥϜ ϑΣε৽ׁʹͯελοϑɺ೥݄ʹεΫϥϜϑΣεઋ୆࣮ߦҕһͱͯ͠ୈճεΫϥϜ ϑΣεઋ୆͔ΒܞΘΔɻ͜Ε·ͰʹɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ɺεΫϥϜ ϑΣεࡾՏɺ3FHJPOBM4DSVN(BUIFSJOH5PLZPɺεΫϥϜϑΣε෱Ԭͱ͍ͬͨΧϯ ϑΝϨϯεͷελοϑΛ௨ࢉճ຿ΊɺεΫϥϜϑΣεେࡕɺεΫϥϜϑΣεઋ୆ɺ91ࡇ Γɺ;Γ͔͑ΓΧϯϑΝϨϯεɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ͳͲଟ਺ͷΧϯ ϑΝϨϯεͰొஃɻ91ࡇΓΛ͸͡Ίͱͯ͠ɺࠓޙ΋͍͔ͭ͘ͷΧϯϑΝϨϯεͰͷొஃΛ༧ ఆ͍ͯ͠ΔɻೝఆεΫϥϜϚελʔɻ
  11. ©amixedcolor ͜Μͳ͜ͱΛ͖ͯͨ͠ͻͱ 35 อཾࣇʢΤΠϛBNJYFEDPMPSʣ ϓϩμΫτσΟϕϩοϓϝϯτࣄۀ෦ ΤϯδχΞ ౦ژ౎ཱࠃࡍߴ౳ֶߍଔۀޙɺஜ೾େֶ৘ใֶ܈৘ใՊֶྨʹೖֶ͠೥݄ʹଔۀɻ ಉ݄ʹ3FMJDʹ৽ଔͱͯ͠ೖࣾɻݱࡏ͸όοΫΤϯυΤϯδχΞͱͯ͠׆༂ɻֶੜ࣌୅ʹ ͸ɺஜ೾େֶͰFO1J5ͱݺ͹ΕΔतۀͰΞδϟΠϧ։ൃΛֶͼɺνʔϜ։ൃΛ࣮ફɻ೥࣍ ʹ͸௨೥ͰಉतۀΛडߨɺ৆Λड৆ɻֶۀͱฒߦͯ͠ɺίϛϡχςΟ׆ಈʹੵۃతʹࢀՃ

    ͠ɺ೥݄ʹ%BW0QT%BZT 5PLZPʹͯϘϥϯςΟΞελοϑɺಉ݄ʹεΫϑϥϜ ϑΣε৽ׁʹͯελοϑɺ೥݄ʹεΫϥϜϑΣεઋ୆࣮ߦҕһͱͯ͠ୈճεΫϥϜ ϑΣεઋ୆͔ΒܞΘΔɻ͜Ε·ͰʹɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ɺεΫϥϜ ϑΣεࡾՏɺ3FHJPOBM4DSVN(BUIFSJOH5PLZPɺεΫϥϜϑΣε෱Ԭͱ͍ͬͨΧϯ ϑΝϨϯεͷελοϑΛ௨ࢉճ຿ΊɺεΫϥϜϑΣεେࡕɺεΫϥϜϑΣεઋ୆ɺ91ࡇ Γɺ;Γ͔͑ΓΧϯϑΝϨϯεɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ͳͲଟ਺ͷΧϯ ϑΝϨϯεͰొஃɻ91ࡇΓΛ͸͡Ίͱͯ͠ɺࠓޙ΋͍͔ͭ͘ͷΧϯϑΝϨϯεͰͷొஃΛ༧ ఆ͍ͯ͠ΔɻೝఆεΫϥϜϚελʔɻ
  12. ©amixedcolor ͜Μͳ͜ͱΛ͖ͯͨ͠ͻͱ 36 อཾࣇʢΤΠϛBNJYFEDPMPSʣ ϓϩμΫτσΟϕϩοϓϝϯτࣄۀ෦ ΤϯδχΞ ౦ژ౎ཱࠃࡍߴ౳ֶߍଔۀޙɺஜ೾େֶ৘ใֶ܈৘ใՊֶྨʹೖֶ͠೥݄ʹଔۀɻ ಉ݄ʹ3FMJDʹ৽ଔͱͯ͠ೖࣾɻݱࡏ͸όοΫΤϯυΤϯδχΞͱͯ͠׆༂ɻֶੜ࣌୅ʹ ͸ɺஜ೾େֶͰFO1J5ͱݺ͹ΕΔतۀͰΞδϟΠϧ։ൃΛֶͼɺνʔϜ։ൃΛ࣮ફɻ೥࣍ ʹ͸௨೥ͰಉतۀΛडߨɺ৆Λड৆ɻֶۀͱฒߦͯ͠ɺίϛϡχςΟ׆ಈʹੵۃతʹࢀՃ

    ͠ɺ೥݄ʹ%BW0QT%BZT 5PLZPʹͯϘϥϯςΟΞελοϑɺಉ݄ʹεΫϑϥϜ ϑΣε৽ׁʹͯελοϑɺ೥݄ʹεΫϥϜϑΣεઋ୆࣮ߦҕһͱͯ͠ୈճεΫϥϜ ϑΣεઋ୆͔ΒܞΘΔɻ͜Ε·ͰʹɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ɺεΫϥϜ ϑΣεࡾՏɺ3FHJPOBM4DSVN(BUIFSJOH5PLZPɺεΫϥϜϑΣε෱Ԭͱ͍ͬͨΧϯ ϑΝϨϯεͷελοϑΛ௨ࢉճ຿ΊɺεΫϥϜϑΣεେࡕɺεΫϥϜϑΣεઋ୆ɺ91ࡇ Γɺ;Γ͔͑ΓΧϯϑΝϨϯεɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ͳͲଟ਺ͷΧϯ ϑΝϨϯεͰొஃɻ91ࡇΓΛ͸͡Ίͱͯ͠ɺࠓޙ΋͍͔ͭ͘ͷΧϯϑΝϨϯεͰͷొஃΛ༧ ఆ͍ͯ͠ΔɻೝఆεΫϥϜϚελʔɻ
  13. ©amixedcolor 45 ৽͍͜͠ͱ͸Θ͔Βͳ͍΋ͷɻ ͡Ό͋Ͳ͏͢Δʁ  n まずは公式ドキュメント n https://readouble.com/laravel n

    https://laravel.com/docs n 次にソースコード n https://github.com/laravel/laravel n “project-root/vendor/laravel/framework/src/Illuminate”
  14. ©amixedcolor 46 ৽͍͜͠ͱ͸Θ͔Βͳ͍΋ͷɻ ͡Ό͋Ͳ͏͢Δʁ  n そしてChatGPT n たどったソースコードを送ったり n

    ステップバイステップにしたり n 「つまり〜〜ということですか?」と聞く!
  15. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 48 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上 7. app関数・makeメソッド・各種ヘルパー関数 ←配属3ヶ月目
  16. ©amixedcolor ෼͔Βͳ͍࢓༷ɺ IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ 49 1. RefleshDatabaseTraitとDatabaseMigrationTraitの 微妙な違いや使い分け ←実践研修1週目(php歴3-4日) 2. CamelCaseとsnake_caseの扱い方

    ←配属1ヶ月目 (歴3-4週) 3. ルートモデルバインディングについて ←同上 4. middlewareとpipelineについて ←配属2ヶ月目 (歴7-8週) 5. AuthorizationExceptionについて ←同上 6. クエリビルダとモデルインスタンスとupdate()とその周辺 ←同上 7. app関数・makeメソッド・各種ヘルパー関数 ←配属3ヶ月目
  17. ©amixedcolor ͡Ό͋ͦͷιʔεʹඈΜͰΈΔ class Route extends Facade { /** * Get

    the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'router'; } } 57
  18. ©amixedcolor ͡Ό͋ͦͷιʔεʹඈΜͰΈΔ class Route extends Facade { /** * Get

    the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'router'; } } ココなに!?!? 58
  19. ©amixedcolor ͡Ό͋ͦͷιʔεʹඈΜͰΈΔ class Route extends Facade { /** * Get

    the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'router'; } } ココなに!?!? ココなに!?!? 59
  20. ©amixedcolor エイミの入力 ChatGPT (GPT-4) の出力 Ͱ΋࣮૷͕ͳ͍ͷͰ$IBU(15ʹฉ͍ͯΈΔ my-project/vendor/laravel/ framework/src/Illuminate/ Support/Facades/Route.php にある、下記のメソッドはどこで

    実装されていますか?パスを教 えて欲しいです * @method static void model(string $key, string $class, ¥Closure|null $callback = null) (前略(ファサードの説明)) …したがって、modelメソッドの実 装は、Illuminate¥Routing¥Router クラスにあります。 あなたのプロジェクト内でのパス は、おそらく以下の通りです。 my-project/vendor/laravel/ framework/src/Illuminate/ Routing/Router.php 65
  21. ©amixedcolor zNPEFMzͰݕࡧɺ݅ώοτʂ ಉ͡Օॴ /** * Register a model binder for

    a wildcard. * * @param string $key * @param string $class * @param ¥Closure|null $callback * @return void */ public function model ($key, $class, Closure $callback = null) { $this->bind($key, RouteBinding: :forModel($this->container, $class, $callback)); } ヒット! ヒット! 68
  22. ©amixedcolor ݟͯΈΑ͏ /** * Register a model binder for a

    wildcard. * * @param string $key * @param string $class * @param ¥Closure|null $callback * @return void */ public function model ($key, $class, Closure $callback = null) { $this->bind($key, RouteBinding: :forModel($this->container, $class, $callback)); } 69
  23. ©amixedcolor ݟͯΈΑ͏ /** * Register a model binder for a

    wildcard. * * @param string $key * @param string $class * @param ¥Closure|null $callback * @return void */ public function model ($key, $class, Closure $callback = null) { $this->bind($key, RouteBinding: :forModel($this->container, $class, $callback)); } ココなに!?!? 70
  24. ©amixedcolor ݟͯΈΑ͏ /** * Register a model binder for a

    wildcard. * * @param string $key * @param string $class * @param ¥Closure|null $callback * @return void */ public function model ($key, $class, Closure $callback = null) { $this->bind($key, RouteBinding: :forModel($this->container, $class, $callback)); } ココなに!?!? ココなに!?!? 71
  25. ©amixedcolor ݟͯΈΑ͏ /** * Register a model binder for a

    wildcard. * * @param string $key * @param string $class * @param ¥Closure|null $callback * @return void */ public function model ($key, $class, Closure $callback = null) { $this->bind($key, RouteBinding: :forModel($this->container, $class, $callback)); } ココなに!?!? ココなに!?!? ココなに!?!? 72
  26. ©amixedcolor WTDPEFͷ֦ுػೳͰͦͷ··ભҠ /** * Add a new route parameter binder.

    * * @param string $key * @param string|callable $binder * @return void */ public function bind($key, $binder) { $this->binders[str_replace('-', '_', $key)] = RouteBinding::forCallback( $this->container, $binder ); } 74
  27. ©amixedcolor WTDPEFͷ֦ுػೳͰͦͷ··ભҠ /** * Add a new route parameter binder.

    * * @param string $key * @param string|callable $binder * @return void */ public function bind($key, $binder) { $this->binders[str_replace('-', '_', $key)] = RouteBinding::forCallback( $this->container, $binder ); } ココなに!?!? 75
  28. ©amixedcolor WTDPEFͷ֦ுػೳͰͦͷ··ભҠ /** * Add a new route parameter binder.

    * * @param string $key * @param string|callable $binder * @return void */ public function bind($key, $binder) { $this->binders[str_replace('-', '_', $key)] = RouteBinding::forCallback( $this->container, $binder ); } ココなに!?!? ココなに!?!? 76
  29. ©amixedcolor エイミの入力 ChatGPT (GPT-4) の出力 ฉ͍ͯΈΑ͏ʂ my-project/vendor/laravel/ framework/src/Illuminate /Routing/RouteBinding.php にある、下記のコードをステップ

    バイステップで解説して欲しいで す ==== {{(省略)ここにコード}} このRouteBindingクラスは、 Laravelのルーティングコンポーネ ントの一部で、ルートパラメータ のカスタムバインディングのロ ジックを管理します。 続く ⇉⇉ (次のスライド) 95
  30. ©amixedcolor ͲΕͲΕʙʁ 1. forCallbackメソッド: このメソッドは、指定されたバインダが文字列かクロージャかによって、ク ロージャを返します。$binderが文字列の場合、createClassBindingメソッドを呼び出します。そ うでない場合、$binderをそのまま返します。 2. createClassBindingメソッド: このメソッドは、IoCコンテナを使用してクラスベースのバインディ

    ングを作成します。$bindingがClass@method形式の場合、$container->make($class)でクラス のインスタンスを作成し、その$methodメソッドを呼び出します。$valueと$routeは、$methodに 渡されます。 3. forModelメソッド: このメソッドは、モデルのルートバインディングを作成します。$valueがnullの 場合、nullを返します。そうでない場合、$container->make($class)でモデルのインスタンスを 作成し、resolveRouteBindingメソッドを呼び出します。このメソッドがモデルを返す場合、その モデルが返されます。モデルが見つからない場合、指定された$callbackがあれば、それが呼 び出されます。$callbackがない場合、ModelNotFoundExceptionがスローされます。 このクラスの主な目的は、ルートパラメータのカスタムバインディングを管理するためのクロージャ を作成することです。これにより、ルートパラメータが、指定されたモデルのインスタンスや、任意の カスタムロジックで解決されることができます。 96
  31. ©amixedcolor ͲΕͲΕʙʁ 1. forCallbackメソッド: このメソッドは、指定されたバインダが文字列かクロージャかによって、ク ロージャを返します。$binderが文字列の場合、createClassBindingメソッドを呼び出します。そ うでない場合、$binderをそのまま返します。 2. createClassBindingメソッド: このメソッドは、IoCコンテナを使用してクラスベースのバインディ

    ングを作成します。$bindingがClass@method形式の場合、$container->make($class)でクラス のインスタンスを作成し、その$methodメソッドを呼び出します。$valueと$routeは、$methodに 渡されます。 3. forModelメソッド: このメソッドは、モデルのルートバインディングを作成します。$valueがnullの 場合、nullを返します。そうでない場合、$container->make($class)でモデルのインスタンスを 作成し、resolveRouteBindingメソッドを呼び出します。このメソッドがモデルを返す場合、その モデルが返されます。モデルが見つからない場合、指定された$callbackがあれば、それが呼 び出されます。$callbackがない場合、ModelNotFoundExceptionがスローされます。 このクラスの主な目的は、ルートパラメータのカスタムバインディングを管理するためのクロージャ を作成することです。これにより、ルートパラメータが、指定されたモデルのインスタンスや、任意の カスタムロジックで解決されることができます。 これっぽいな?? 97
  32. ©amixedcolor エイミの入力 ChatGPT (GPT-4) の出力 ·ͨ·ͨฉ͍ͯΈΔ 今と同じパスの同じファイル (RouteBinding.php)にある、下記 のメソッドだけもう少し詳しく、ス テップバイステップで解説して欲

    しいです。これはControllerにあ る変数名とはどう関連づくので しょうか? ==== (先ほど同様、コードは省略) RouteBinding::forModelメソッド は、モデルのルートバインディン グ用のクロージャを作成する静 的メソッドです。 続く ⇉⇉ (次のスライド) 100
  33. ©amixedcolor ͜Ε·ͨ௕͍Μͩͳ͋ ʢεςοϓόΠεςοϓΛৄ͠ΊͳͷͰͦΓΌͦ͏Ͱ͸͋Δʣ 以下、そのステップバイステップの解説です。 パラメータ: $container: IoCコンテナのインスタンス。 $class: バインドするモデルクラスの名前。 $callback:

    モデルが見つからない場合に呼び出されるオプションのコールバック。 クロージャの作成: forModelメソッドは、指定された$container、$class、および$callbackを使用してクロージャを作成し、そのクロージャを返します。 クロージャのロジック: クロージャは、1つのパラメータ$valueを取ります。これは、ルートパラメータの値です。 $valueがnullの場合、クロージャはnullを返し、終了します。 $valueがnullでない場合、クロージャは$container->make($class)を使用して、指定されたクラスの新しいインスタンス($instance)を作成します。 クロージャは、$instance->resolveRouteBinding($value)を呼び出します。これは、モデルインスタンスのresolveRouteBindingメソッドを呼び出し、指定された$valueを使用してモデルを取得します。 resolveRouteBindingメソッドがモデルを返す場合、クロージャはそのモデルを返し、終了します。 resolveRouteBindingメソッドがnullを返す場合、クロージャは$callbackを確認します。 $callbackがクロージャの場合、クロージャは$callback($value)を呼び出し、その結果を返します。 $callbackがクロージャでない場合、クロージャはModelNotFoundExceptionをスローします。これにより、モデルが見つからない場合に404エラーが返されます。 コントローラとの関連性: コントローラ内の変数名とこのメソッドは直接関連していません。ただし、このメソッドは、ルートパラメータのバインディングを解決するためのクロージャを作成します。これにより、ルートパラメータが コントローラアクションに渡される際に、適切なモデルインスタンスが渡されるようになります。 例えば、ルート定義が以下のようになっている場合: php Copy code Route::get('posts/{post}', 'PostController@show'); {post}パラメータは、PostController@showアクションに渡される前に、forModelメソッドによって作成されたクロージャを使って解決されます。その結果、PostController@showアクションは、$postパラ メータとしてPostモデルのインスタンスを受け取ります。 101
  34. ©amixedcolor ͜Μͳ͜ͱΛ͖ͯͨ͠ͻͱ อཾࣇʢΤΠϛBNJYFEDPMPSʣ ϓϩμΫτσΟϕϩοϓϝϯτࣄۀ෦ ΤϯδχΞ ౦ژ౎ཱࠃࡍߴ౳ֶߍଔۀޙɺஜ೾େֶ৘ใֶ܈৘ใՊֶྨʹೖֶ͠೥݄ʹଔۀɻ ಉ݄ʹ3FMJDʹ৽ଔͱͯ͠ೖࣾɻݱࡏ͸όοΫΤϯυΤϯδχΞͱͯ͠׆༂ɻֶੜ࣌୅ʹ ͸ɺஜ೾େֶͰFO1J5ͱݺ͹ΕΔतۀͰΞδϟΠϧ։ൃΛֶͼɺνʔϜ։ൃΛ࣮ફɻ೥࣍ ʹ͸௨೥ͰಉतۀΛडߨɺ৆Λड৆ɻֶۀͱฒߦͯ͠ɺίϛϡχςΟ׆ಈʹੵۃతʹࢀՃ ͠ɺ೥݄ʹ%BW0QT%BZT

    5PLZPʹͯϘϥϯςΟΞελοϑɺಉ݄ʹεΫϑϥϜ ϑΣε৽ׁʹͯελοϑɺ೥݄ʹεΫϥϜϑΣεઋ୆࣮ߦҕһͱͯ͠ୈճεΫϥϜ ϑΣεઋ୆͔ΒܞΘΔɻ͜Ε·ͰʹɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ɺεΫϥϜ ϑΣεࡾՏɺ3FHJPOBM4DSVN(BUIFSJOH5PLZPɺεΫϥϜϑΣε෱Ԭͱ͍ͬͨΧϯ ϑΝϨϯεͷελοϑΛ௨ࢉճ຿ΊɺεΫϥϜϑΣεେࡕɺεΫϥϜϑΣεઋ୆ɺ91ࡇ Γɺ;Γ͔͑ΓΧϯϑΝϨϯεɺεΫϥϜϑΣε৽ׁɺεΫϥϜϑΣεઋ୆ͳͲଟ਺ͷΧϯ ϑΝϨϯεͰొஃɻ91ࡇΓΛ͸͡Ίͱͯ͠ɺࠓޙ΋͍͔ͭ͘ͷΧϯϑΝϨϯεͰͷొஃΛ༧ ఆ͍ͯ͠ΔɻೝఆεΫϥϜϚελʔɻ 114