Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 4 ͋Δ೔ͷ͜ͱʜ

Slide 5

Slide 5 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 5 ৽ଔͱͯ͠ब৬ɺ

Slide 6

Slide 6 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 6 ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ Ίͯ৮Δ1)1ɺ

Slide 7

Slide 7 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 7 ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ Ίͯ৮Δ1)1ɺॳΊͯ৮Δ Laravelɺ

Slide 8

Slide 8 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 8 ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ Ίͯ৮Δ1)1ɺॳΊͯ৮Δ LaravelɺଔۀࢼݧΛಥഁ͠഑ ଐ͞Εɺ

Slide 9

Slide 9 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 9 ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ Ίͯ৮Δ1)1ɺॳΊͯ৮Δ LaravelɺଔۀࢼݧΛಥഁ͠഑ ଐ͞Εɺ͞Βʹ޿͕Δੈքʜʜ

Slide 10

Slide 10 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 10 ৽ଔͱͯ͠ब৬ɺݚमΛड͚ॳ Ίͯ৮Δ1)1ɺॳΊͯ৮Δ LaravelɺଔۀࢼݧΛಥഁ͠഑ ଐ͞Εɺ͞Βʹ޿͕Δੈքʜʜ

Slide 11

Slide 11 text

©amixedcolor ͳͥ๻͕͜͜ʹ͍Δͷ͔ʁ 11 LaravelɺԿ͕Ͳ͏ͳͬͯΔΜ ͩʂʁʁʁʂʁʁʂʁʁʂʁ

Slide 12

Slide 12 text

©amixedcolor ෼͔Βͳ͍࢓༷ɺ 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

©amixedcolor BUSINESS Relicでは大きく 3つの事業 で 日本企業の新規事業開発やイノベーション創出を支援していま す オープンイノベーション 新規事業に投資/協業 Relicも当事者となり、事業パートナー とともに新規事業を共創する 新規事業支援に特化した SaaS型プラットフォーム / プロダクトの提供 インキュベーションテック 新規事業特化のSaaS型プロダクト 独自の新規事業ノウハウを活用した 伴走型の事業コンサルティング 新規事業に関する課題を解決/支援 事業プロデュース

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

©amixedcolor ではでは…

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

©amixedcolor 01 ॳΊ·ͯ͠Laravel

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

©amixedcolor の前に… 42

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

©amixedcolor では改めて 44

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

©amixedcolor 46 ৽͍͜͠ͱ͸Θ͔Βͳ͍΋ͷɻ ͡Ό͋Ͳ͏͢Δʁ n そしてChatGPT n たどったソースコードを送ったり n ステップバイステップにしたり n 「つまり〜〜ということですか?」と聞く!

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

©amixedcolor さてさて… 55

Slide 56

Slide 56 text

©amixedcolor VTFจΛΈͯΈΔ ه߸͸Α͠ͳʹ use Illuminate¥Support¥Facades¥Route; 56

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

©amixedcolor lNPEFMzͰݕࡧͯ͠ΈΔͱ݅ώοτ վߦ΍ΠϯσϯτΛΑ͠ͳʹ͍ͯ͠·͢ * @method static void model( string $key, string $class, ¥Closure|null $callback = null ) 64

Slide 65

Slide 65 text

©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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

©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

Slide 69

Slide 69 text

©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

Slide 70

Slide 70 text

©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

Slide 71

Slide 71 text

©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

Slide 72

Slide 72 text

©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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

©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

Slide 75

Slide 75 text

©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

Slide 76

Slide 76 text

©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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

©amixedcolor (探すと…) 83

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

©amixedcolor エイミの入力 ChatGPT (GPT-4) の出力 ฉ͍ͯΈΑ͏ʂ my-project/vendor/laravel/ framework/src/Illuminate /Routing/RouteBinding.php にある、下記のコードをステップ バイステップで解説して欲しいで す ==== {{(省略)ここにコード}} このRouteBindingクラスは、 Laravelのルーティングコンポーネ ントの一部で、ルートパラメータ のカスタムバインディングのロ ジックを管理します。 続く ⇉⇉ (次のスライド) 95

Slide 96

Slide 96 text

©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

Slide 97

Slide 97 text

©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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

©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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

©amixedcolor 8F"SF )JSJOH

Slide 113

Slide 113 text

©amixedcolor さいごに… 113

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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