$30 off During Our Annual Pro Sale. View Details »

初めまして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
    גࣜձࣾ3FMJD ΤϯδχΞ
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ॳΊ·ͯ͠ Laravelɺ
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide

  2. ©amixedcolor
    ࠓ೔ͷςʔϚ
    2
    ৽ଔΤϯδχΞͷ৘೤ͱ୳ڀ৺
    ʹ৮ΕͯɺLaravelΛ೷͘ʂ

    View Slide

  3. ©amixedcolor
    ࣗݾ঺հ
    3
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ৬छΤϯδχΞ
    ۀ຿8FCΞϓϦόοΫΤϯυ։ൃͳͲ
    ޷͖ͳτϐοΫ
    ΞδϟΠϧɺεΫϥϜɺ৽نࣄۀ։ൃ
    Α͍͘ΔίϛϡχςΟ
    ΞδϟΠϧίϛϡχςΟ
    @amixedcolor

    View Slide

  4. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    4
    ͋Δ೔ͷ͜ͱʜ

    View Slide

  5. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    5
    ৽ଔͱͯ͠ब৬ɺ

    View Slide

  6. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    6
    ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ
    Ίͯ৮Δ1)1ɺ

    View Slide

  7. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    7
    ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ
    Ίͯ৮Δ1)1ɺॳΊͯ৮Δ
    Laravelɺ

    View Slide

  8. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    8
    ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ
    Ίͯ৮Δ1)1ɺॳΊͯ৮Δ
    LaravelɺଔۀࢼݧΛಥഁ͠഑
    ଐ͞Εɺ

    View Slide

  9. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    9
    ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ
    Ίͯ৮Δ1)1ɺॳΊͯ৮Δ
    LaravelɺଔۀࢼݧΛಥഁ͠഑
    ଐ͞Εɺ͞Βʹ޿͕Δੈքʜʜ

    View Slide

  10. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    10
    ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ
    Ίͯ৮Δ1)1ɺॳΊͯ৮Δ
    LaravelɺଔۀࢼݧΛಥഁ͠഑
    ଐ͞Εɺ͞Βʹ޿͕Δੈքʜʜ

    View Slide

  11. ©amixedcolor
    ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ

    11
    LaravelɺԿ͕Ͳ͏ͳͬͯΔΜ
    ͩʂʁʁʁʂʁʁʂʁʁʂʁ

    View Slide

  12. ©amixedcolor
    ෼͔Βͳ͍࢓༷ɺ
    12

    View Slide

  13. ©amixedcolor
    ෼͔Βͳ͍࢓༷ɺ
    IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ
    13

    View Slide

  14. ©amixedcolor
    ෼͔Βͳ͍࢓༷ɺ
    IlluminateΛಡΜͰ΋෼͔Βͳ͍࢓૊Έ
    14
    1. RefleshDatabaseTraitとDatabaseMigrationTraitの
    微妙な違いや使い分け

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. ©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について

    View Slide

  23. ©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について ←同上

    View Slide

  24. ©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()とその周辺

    View Slide

  25. ©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()とその周辺 ←同上

    View Slide

  26. ©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メソッド・各種ヘルパー関数

    View Slide

  27. ©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ヶ月目

    View Slide

  28. ©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ヶ月目

    View Slide

  29. ©amixedcolor
    ࠓ೔ͷςʔϚ
    29
    ৽ଔΤϯδχΞͷz৘೤ͱ୳ڀ৺
    ʹ৮ΕͯzɺLaravelΛ೷͘ʂ

    View Slide

  30. ©amixedcolor
    גࣜձࣾ3FMJD ΤϯδχΞ
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ॳΊ·ͯ͠ Laravelɺ
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide

  31. ©amixedcolor
    ࣗݾ঺հ
    31
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ৬छΤϯδχΞ
    ۀ຿8FCΞϓϦόοΫΤϯυ։ൃͳͲ
    ޷͖ͳτϐοΫ
    ΞδϟΠϧɺεΫϥϜɺ৽نࣄۀ։ൃ
    Α͍͘ΔίϛϡχςΟ
    ΞδϟΠϧίϛϡχςΟ
    @amixedcolor

    View Slide

  32. ©amixedcolor
    ࣗݾ঺հ
    32
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ৬छΤϯδχΞ
    ۀ຿8FCΞϓϦόοΫΤϯυ։ൃͳͲ
    ޷͖ͳτϐοΫ
    ΞδϟΠϧɺεΫϥϜɺ৽نࣄۀ։ൃ
    Α͍͘ΔίϛϡχςΟ
    ΞδϟΠϧίϛϡχςΟ
    OFX
    1)1ίϛϡχςΟ
    @amixedcolor

    View Slide

  33. ©amixedcolor
    BUSINESS
    Relicでは大きく 3つの事業 で
    日本企業の新規事業開発やイノベーション創出を支援していま

    オープンイノベーション
    新規事業に投資/協業
    Relicも当事者となり、事業パートナー
    とともに新規事業を共創する
    新規事業支援に特化した
    SaaS型プラットフォーム / プロダクトの提供
    インキュベーションテック
    新規事業特化のSaaS型プロダクト
    独自の新規事業ノウハウを活用した
    伴走型の事業コンサルティング
    新規事業に関する課題を解決/支援
    事業プロデュース

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. ©amixedcolor
    ではでは…

    View Slide

  38. ©amixedcolor
    ໨࣍
    38
    ॳΊ·ͯ͠Laravel
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ
    य़ʹब৬ͨ͠͹͔Γͷ৽ଔΤϯδχΞ͕
    ௐ΂ͨ಺෦࢓༷ͱɺͦͷϓϩηε

    View Slide

  39. ©amixedcolor
    01
    ॳΊ·ͯ͠Laravel

    View Slide

  40. ©amixedcolor 40
    ࣌͸૎Γϲ݄൒લͷ͜ͱ
    n ビジネス職・開発職を問わない新卒研修、約3週間を終えて、、
    n 開発職、その中でもエンジニアに限った「エンジニア実践研修」
    n 与えられた課題はECサイトをつくること
    n 3つのフェーズ・毎回のレビュー・卒業試験
    n 初めて触るPHPと、初めて触るLaravel
    n まったくわからない動き方、内部仕様

    View Slide

  41. ©amixedcolor
    02
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide

  42. ©amixedcolor
    の前に…
    42

    View Slide

  43. ©amixedcolor 43
    લఏ
    n バージョンは、研修の際は8.x系、配属されてからは9.x系でした
    n 引用するコードは全て、バージョン9.1です
    n ほかの人に聞くことでも内部仕様は探求できますし、実際には隣の席の
    人や先輩エンジニアの方に聞いたりしていましたが、今回発表する部分
    は自分1人の力で探求することに焦点を当てています
    n 質問力はもちろんなのですが、自走力に焦点を当てています
    n (後述しますが)質問力も養われるプロセスを踏んでいます

    View Slide

  44. ©amixedcolor
    では改めて
    44

    View Slide

  45. ©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”

    View Slide

  46. ©amixedcolor 46
    ৽͍͜͠ͱ͸Θ͔Βͳ͍΋ͷɻ
    ͡Ό͋Ͳ͏͢Δʁ

    n そしてChatGPT
    n たどったソースコードを送ったり
    n ステップバイステップにしたり
    n 「つまり〜〜ということですか?」と聞く!

    View Slide

  47. ©amixedcolor
    03
    य़ʹब৬ͨ͠͹͔Γͷ৽ଔΤϯδχΞ͕
    ௐ΂ͨ಺෦࢓༷ͱɺͦͷϓϩηε

    View Slide

  48. ©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ヶ月目

    View Slide

  49. ©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ヶ月目

    View Slide

  50. ©amixedcolor
    ·ͣ͸͜͜ɺࣗ෼ͷίʔυ͔Β
    Route::controller(MyController::class)
    ->group(function () {
    Route::get(
    '/my-
    endpoint/{some_id_of_some_model}',
    'myMethod’
    );
    });
    50

    View Slide

  51. ©amixedcolor
    ·ͣ͸͜͜ɺࣗ෼ͷίʔυ͔Β
    Route::controller(MyController::class)
    ->group(function () {
    Route::get(
    '/my-
    endpoint/{some_id_of_some_model}',
    'myMethod’
    );
    });
    ココなに!?!?
    51

    View Slide

  52. ©amixedcolor
    どうやらcontrollerの変数名と同じもの
    をどうにかこうにかしているらしい
    52

    View Slide

  53. ©amixedcolor
    どうやらcontrollerの変数名と同じもの
    をどうにかこうにかしているらしい
    ココなに!?!?
    53

    View Slide

  54. ©amixedcolor
    ⇊いろいろあったけどまず、割愛🙏⇊
    snake_case と lowerCamelCase の
    自動的な変換(?)
    54

    View Slide

  55. ©amixedcolor
    さてさて…
    55

    View Slide

  56. ©amixedcolor
    VTFจΛΈͯΈΔ ه߸͸Α͠ͳʹ

    use Illuminate¥Support¥Facades¥Route;
    56

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  60. ©amixedcolor
    ⇊こちらも時間の都合上、割愛🙏⇊
    ・Facadeとはなにか
    ・どうそれが結びついているのか
    60

    View Slide

  61. ©amixedcolor
    とりあえずそれっぽい単語で検索
    61

    View Slide

  62. ©amixedcolor
    とりあえずそれっぽい単語での
    検索をしてみよう!
    62

    View Slide

  63. ©amixedcolor
    「ルートモデルバインディング」だから、
    modelとか、bindとかかなあ?🤔
    63

    View Slide

  64. ©amixedcolor
    lNPEFMzͰݕࡧͯ͠ΈΔͱ݅ώοτ
    վߦ΍ΠϯσϯτΛΑ͠ͳʹ͍ͯ͠·͢

    * @method static void model(
    string $key,
    string $class,
    ¥Closure|null $callback = null
    )
    64

    View Slide

  65. ©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

    View Slide

  66. ©amixedcolor
    見に行ってみよう!
    66

    View Slide

  67. ©amixedcolor
    (1476行あったのもありつつ)
    まずはそのメソッド名で検索してみよう
    67

    View Slide

  68. ©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

    View Slide

  69. ©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

    View Slide

  70. ©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

    View Slide

  71. ©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

    View Slide

  72. ©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

    View Slide

  73. ©amixedcolor
    まずは同じモデルのメソッドから
    見てみよう
    73

    View Slide

  74. ©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

    View Slide

  75. ©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

    View Slide

  76. ©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

    View Slide

  77. ©amixedcolor
    str_replaceは名前的になんとなく
    わかる。多分 snake_case でも、
    kebab-case でも、 lowerCamelCase
    にしているんだろう
    77

    View Slide

  78. ©amixedcolor
    (というかこれって…!!)
    78

    View Slide

  79. ©amixedcolor
    ⇊いろいろあったけどまず、割愛🙏⇊
    snake_case と lowerCamelCase の
    自動的な変換(?)
    79

    View Slide

  80. ©amixedcolor
    なんか前にちょっと見た関数だ!
    (そりゃそうといえばそうではある)
    80

    View Slide

  81. ©amixedcolor
    まあまあ、話を戻して
    RouteBinding モデル????
    81

    View Slide

  82. ©amixedcolor
    use文になったので、
    同じディレクトリにあるはず
    82

    View Slide

  83. ©amixedcolor
    (探すと…)
    83

    View Slide

  84. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    84

    View Slide

  85. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    85

    View Slide

  86. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    86

    View Slide

  87. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    87

    View Slide

  88. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    88

    View Slide

  89. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    89

    View Slide

  90. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    90

    View Slide

  91. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    91

    View Slide

  92. ©amixedcolor
    あった!85行のコードだ。
    さーっと読んでみよう…
    92

    View Slide

  93. ©amixedcolor
    そんなときのためのー?
    93

    View Slide

  94. ©amixedcolor
    (せーの!)
    ChatGPTー!
    94

    View Slide

  95. ©amixedcolor
    エイミの入力 ChatGPT (GPT-4) の出力
    ฉ͍ͯΈΑ͏ʂ
    my-project/vendor/laravel/
    framework/src/Illuminate
    /Routing/RouteBinding.php
    にある、下記のコードをステップ
    バイステップで解説して欲しいで

    ====
    {{(省略)ここにコード}}
    このRouteBindingクラスは、
    Laravelのルーティングコンポーネ
    ントの一部で、ルートパラメータ
    のカスタムバインディングのロ
    ジックを管理します。
    続く ⇉⇉ (次のスライド)
    95

    View Slide

  96. ©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

    View Slide

  97. ©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

    View Slide

  98. ©amixedcolor
    ΋͏গ͠ಡΜͰΈΔ
    forModelメソッド:
    このメソッドは、モデルのルートバインディングを作成します。$valueがnull
    の場合、nullを返します。そうでない場合、$container->make($class)でモ
    デルのインスタンスを作成し、resolveRouteBindingメソッドを呼び出しま
    す。このメソッドがモデルを返す場合、そのモデルが返されます。モデル
    が見つからない場合、指定された$callbackがあれば、それが呼び出され
    ます。$callbackがない場合、ModelNotFoundExceptionがスローされます。
    このクラスの主な目的は、ルートパラメータのカスタムバインディングを管
    理するためのクロージャを作成することです。これにより、ルートパラメー
    タが、指定されたモデルのインスタンスや、任意のカスタムロジックで解決
    されることができます。
    98

    View Slide

  99. ©amixedcolor
    あれ?でもControllerどこなんだろう
    99

    View Slide

  100. ©amixedcolor
    エイミの入力 ChatGPT (GPT-4) の出力
    ·ͨ·ͨฉ͍ͯΈΔ
    今と同じパスの同じファイル
    (RouteBinding.php)にある、下記
    のメソッドだけもう少し詳しく、ス
    テップバイステップで解説して欲
    しいです。これはControllerにあ
    る変数名とはどう関連づくので
    しょうか?
    ====
    (先ほど同様、コードは省略)
    RouteBinding::forModelメソッド
    は、モデルのルートバインディン
    グ用のクロージャを作成する静
    的メソッドです。
    続く ⇉⇉ (次のスライド)
    100

    View Slide

  101. ©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

    View Slide

  102. ©amixedcolor
    どうやら、また別のところで
    Controllerとの結び付けは
    行われているらしい
    102

    View Slide

  103. ©amixedcolor
    でもこのメソッドが、これこそが、
    ルートモデルバインディングの
    解決をしてるのか!!
    (厳密には、解決するための
    クロージャっぽい)
    103

    View Slide

  104. ©amixedcolor
    (といったところで、実は…)
    104

    View Slide

  105. ©amixedcolor
    今回はここまででタイムアップ。
    かかった時間はスライドを作成しつつで
    2-3時間でした。
    105

    View Slide

  106. ©amixedcolor
    調べることに注力するなら、感覚値で
    30分あればできると思います。
    早ければ15分!
    106

    View Slide

  107. ©amixedcolor
    だんだん疲れてきてしまうのが中々…
    ですが!!まだ自分には分からない
    境界線がどこなのか、なんとなくですが
    わかりました!
    107

    View Slide

  108. ©amixedcolor
    これぞ無知の知!!(たぶん)
    (正式名称は不知の自覚)
    108

    View Slide

  109. ©amixedcolor
    (自分がどこまで知っているかを知ること
    は非常に大きなヒントですね〜)
    109

    View Slide

  110. ©amixedcolor
    (話を戻して)
    ではでは…
    110

    View Slide

  111. ©amixedcolor
    ࠓ೔ͷςʔϚ
    ৽ଔΤϯδχΞͷz৘೤ͱ୳ڀ৺
    ʹ৮ΕͯzɺLaravelΛ೷͘ʂ
    111

    View Slide

  112. ©amixedcolor
    8F"SF )JSJOH

    View Slide

  113. ©amixedcolor
    さいごに…
    113

    View Slide

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

    View Slide

  115. ©amixedcolor
    גࣜձࣾ3FMJD ΤϯδχΞ
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ॳΊ·ͯ͠ Laravelɺ
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide

  116. ©amixedcolor
    גࣜձࣾ3FMJD ΤϯδχΞ
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ॳΊ·ͯ͠ Laravelɺ
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide

  117. ©amixedcolor
    גࣜձࣾ3FMJD ΤϯδχΞ
    อ ཾࣇʢΤΠϛBNJYFEDPMPSʣ
    ॳΊ·ͯ͠ Laravelɺ
    ܅ͷ͜ͱΛڭ͑ͯ͘Εʂ

    View Slide