Slide 1

Slide 1 text

ある日 オレオレフレームワーク を作りたくなったぞ! Ռ෺Ϧϯ@FruitRiin@misskey.systems ϑΝϯϑΝʔϨ גࣜձࣾ PHPerKaigi 2023 લ໷ࡇ 40෼ 2023/3/23

Slide 2

Slide 2 text

One day....

Slide 3

Slide 3 text

Laravelʹର͢Δ ෩౰ͨΓ͕ڧ͍ͳ͋

Slide 4

Slide 4 text

ෆຬ͕͋ΔͳΒ ࣗ෼ͷཧ૝Λ ͭ͘Ε͹͍͍ͷʹ

Slide 5

Slide 5 text

࡞Ε͹……͍͍ͷʹ……ʁ

Slide 6

Slide 6 text

ΦϨΦϨ͍ͯͧ͘͠ʂ

Slide 7

Slide 7 text

ྩ࿨ͩͧʁ

Slide 8

Slide 8 text

自己紹介 果物リン@FruitRiin • ϑΝϯϑΝʔϨגࣜձࣾ • ݩPHPer, ݱϑϩϯτΤϯυΤϯδχΞ • Vue.js͕޷͖ • PHP໿5೥ͿΓ • PHPͷΏΔ;Θʹ΋ߗ͘΋ॻ͚Δݴޠײେ޷͖ • ϑϨʔϜϫʔΫΛ࡞ͬͯΈͨ͘ͳͬͯ͠·ͬͨ

Slide 9

Slide 9 text

ファンファーレ株式会社 • ࢈ۀഇغ෺ۀքΛλʔήοτʹͨ͠SasS • ഑ंʢγϑτදʣ૊Ήͷ͕৬ਓٕ • ͦΕɺITͰͳΜͱ͔ͳΒΜ͔ʁ • ਺ཧ࠷దԽʢNot ػցֶशʣͰͳΜͱ͔͠·͠ΐ͏ʂ

Slide 10

Slide 10 text

数理最適化とは? • ੍໿ͱ໨తͱ৚݅Λ͍ΕΔͱ࢒Γͷ৚݅ʹม਺ͱͯ͠࠷దͳղ Λݟ͚ͭΔ਺ֶతख๏ • ιϧόͱ͍͏ΞϧΰϦζϜʹ 
 ੍໿ͱ໨తΛ਺ཧϞσϧʹͨ͠΋ͷΛ 
 ৚݅ม਺ͱͱ΋ʹಥͬࠐΉͷ͕഑ं಄ • ϒϥοΫϘοΫεʹ৚͍݅ΕͯγΣΠΫͯ͠ग़ͨ౴͑Ͱ͸ͳ͍

Slide 11

Slide 11 text

の、フロントエンド担当やってます • ʢCM͜͜·Ͱʣ

Slide 12

Slide 12 text

お品書き(目次) • ༻ޠઆ໌ͳͲ • ͳͥΦϨΦϨϑϨʔϜϫʔΫ͸ੜ·Εͨͷ͔ʁ • ϥΠϒϥϦͷ࡞Γํపఈղઆ • ࠓ෩ͷϥΠϒϥϦͷ࢖͍ํ

Slide 13

Slide 13 text

お品書き(目次) • ςετɺCIʢGitHubActionsʣ • Packagist΁ͷެ։ • ·ͱΊ • Appendix

Slide 14

Slide 14 text

༻ޠઆ໌ͳͲ

Slide 15

Slide 15 text

用語説明 • ϑϨʔϜϫʔΫ • ΞϓϦέʔγϣϯ΍ιϑτ΢ΣΞΛ։ൃ͢ΔͨΊͷڞ௨తͳػೳ ΍ϥΠϒϥϦɺઃܭύλʔϯɺϧʔϧͳͲΛ·ͱΊͨ΋ͷ • ΦϨΦϨ • ʮࣗ෼͚ͨͪͩͷɺಠࣗͷʯ • ΦϨΦϨϑϨʔϜϫʔΫ • ࣗࣾ։ൃͷϑϨʔϜϫʔΫ

Slide 16

Slide 16 text

஫ҙ :CAUTION:

Slide 17

Slide 17 text

注意:現代のオレオレフレームワーク • ҰൠతʹϓϩμΫγϣϯʹ౤ೖ͢Δ΂͖Ͱ͸͋Γ·ͤΜ • อक͞Εͳ͍Մೳੑ͕ߴ͍ • ίϛϡχςΟͳͲͳ͍ • υΩϡϝϯτ͕੔උ͞ΕͯΔ͔͸࡞ऀͷؤுΓʹΑΔ • ेதീ۝ͳ͍ • ηΩϡϦςΟͷ໰୊ΛͲ͏͢Δ • Ҿ͖ܧ͗Ͱ·Δ͝ͱϩετςΫϊϩδʔʹͳΔ

Slide 18

Slide 18 text

ࣺͯΑ͏ʂ

Slide 19

Slide 19 text

׬

Slide 20

Slide 20 text

Breaking time

Slide 21

Slide 21 text

ͳͥΦϨΦϨϑϨʔϜϫʔΫ͸ ੜ·Εͨͷ͔

Slide 22

Slide 22 text

オレオレフレームワーク考古学 • ೔ຊͱWebΦϨΦϨϑϨʔϜϫʔΫͷؔΘΓ͸ 
 ϞόΠϧWebͷීٴͱڞʹ͋Δ(2000೥୅ॳ಄ʣ • i-Mode ͱ͔ ez-web ͱ͔ • ιγϟήͷొ৔ • ૣ͘ɺ৭ʑͳΞϓϦέʔγϣϯΛ࡞Γ͍ͨ • ϑϨʔϜϫʔΫΛ࡞Ζ͏

Slide 23

Slide 23 text

有名どころなフレームワークの当時は? • CodeIgniterʢ2006೥ʣ • CakePHPʢ2005೥ʣ • Symfonyʢ2005೥ʣ • Zend Frameworkʢ2006೥ʣ • Yii Frameworkʢ2008೥ʣ • Laravelʢ2011೥ʣ • ౰࣌·ͩଘࡏ͍ͯ͠ͳ͔͔ͬͨɺ 
 ͜ͳΕ͍ͯͳ͔ͬͨ • ബ͍ϑϨʔϜϫʔΫΛϕʔεʹ 
 ࣗࣾ޲͚ʹΧελϚΠζͳͲ • ్த͔ΒҠߦ͸ඇৗʹࠔ೉

Slide 24

Slide 24 text

→౰ͨΓલͷΑ͏ʹ ΦϨΦϨ͍ͯͨ͠ʂ

Slide 25

Slide 25 text

Ruby on Rails の流行 • Ruby on Rails ͸ 2004೥ʹొ৔ • ೔ຊͰ΋2000೥୅ޙ൒ʹٸ଎ʹීٴ • ͳΜͱ͍ͬͯ΋։ൃ͕؆୯Ͱૣ͍ • ͕ɺRubyͳͷͰαʔόʔΛݐͯΔͷ͕ͪΐͬͱΉ͔͍ͣ͠ • ౰࣌ίϯςφͱ͔ͳ͍͠Ͷʂ

Slide 26

Slide 26 text

Laravelの登場 • Laravelͷొ৔͸2011೥ • Ruby on RailsʹӨڹΛڧ͘ड͚ͨϑϨʔϜϫʔΫ • 2010೥୅ޙ൒ʹ͸ɺ೔ຊͰ΋Laravelͷීٴ͕ਐΜͩ • ͱ͍͏͔ೣ΋ḏࢠ΋Laravelʹͳͬͨ

Slide 27

Slide 27 text

ͦͯ͠ྩ࿨ͷݱ୅ʹࢸΔ... ˎͱ͍͏ௐࠪ݁Ռ

Slide 28

Slide 28 text

Ͱ΋࡞Γ͍ͨʂ

Slide 29

Slide 29 text

ΦϨΦϨ͍ͯͧ͘͠ʂ

Slide 30

Slide 30 text

ϥΠϒϥϦͷ࡞Γํ 
 పఈղઆ

Slide 31

Slide 31 text

Composer init • PHPϓϩδΣΫτͷ਽ܗΛ࡞ͬͯ͘ΕΔ

Slide 32

Slide 32 text

[Lib]¥Hello Worldしにいく • srcσΟϨΫτϦʹHelloWorld.php • name ͸ vender/packagename • autoload ͸ 
 େจࣈখจࣈΛ۠ผ͠ͳ͍ • ύοέʔδ໊ͱҰகਪ঑

Slide 33

Slide 33 text

[Lib]HelloWorld.php • namespaceΛautoloadʹ͋ΘͤΔ • Ϋϥε໊ͱϑΝΠϧ໊Λ͋ΘͤΔ • େจࣈখจࣈΛ۠ผ͢Δ

Slide 34

Slide 34 text

どこからもコールされない • ϥΠϒϥϦͳͷͰͦΕ͸ͦ͏ • namespaceͱϑΝΠϧ໊ɺΫϥε໊͕͋ͬͯΕ͹OK

Slide 35

Slide 35 text

[Lib]git push! • ϦϙδτϦʹpush͢Δ • ͱΓ͋͑ͣ Packagist΁ͷొ࿥͸͠ͳ͍

Slide 36

Slide 36 text

[App]呼んでみよう • ΞϓϦέʔγϣϯͷσΟϨΫτϦΛ࡞Δ • composer.jsonΛ࡞Δ • minimum-stability Λdevʹ • requireʹࣗ෼ͷύοέʔδΛ

Slide 37

Slide 37 text

[App]dev-main? • ௨ৗύοέʔδͷόʔδϣϯΛࢦఆ͢Δ • githubͷ৔߹ϒϥϯνΛࢦఆͰ͖Δ • dev- ϓϨϑΟοΫε͕ඞཁ • dev-main όʔδϣϯ͸ mainϒϥϯνͷ࠷৽Λͱͬͯ͘Δ

Slide 38

Slide 38 text

[App] sayHello()! • autoload Λ index.php Ͱݺͼग़͢ • use ͯ͠ new ͯ͠ • php -S localhost:7777

Slide 39

Slide 39 text

🎉 :tada: 🎉

Slide 40

Slide 40 text

面倒なときのライブラリ開発のコツ • Appଆ͔ΒvenderͷதͷlibͷίʔυΛ௚઀͍͡Δ • Ұ௨Γಈ͘͜ͱΛ֬ೝͨ͠ΒlibͷϦϙδτϦ΁

Slide 41

Slide 41 text

Ұ୴ٳܜ

Slide 42

Slide 42 text

ࠓ෩ͷϑϨʔϜϫʔΫͷ࡞Γํ

Slide 43

Slide 43 text

今風のフレームワークの作り方 • ϥΠϒϥϦ͕ଟ༷Խɺθϩ͔Βશ෦ॻ͘ඞཁ͸ͳ͍ • మ൘ͷ෦෼͸ϥΠϒϥϦ͔Βݟસ͑͹͍͍ • ͩ͜ΘΓ͍ͨ෦෼͸ΦʔμʔϝΠυ͍ͯ͘͠

Slide 44

Slide 44 text

͏ͣΒ͞Μͷ ʮؼ͖ͬͯͨʂ ฏ੒࠷ޙͷΦϨΦϨϑϨʔϜϫʔΫͷ ࡞Γํ ʯ Λݟͯ͘Εʂ

Slide 45

Slide 45 text

ライブラリによって得られるもの • ৴པͱ࣮੷ • ίϛϡχςΟ • ʮී௨ʯ

Slide 46

Slide 46 text

ϑϨʔϜϫʔΫͷίϯηϓτ

Slide 47

Slide 47 text

フレームワークのコンセプト • جຊ͸JSON͔͠ฦ͞ͳ͍API ϑϨʔϜϫʔΫ • ςϯϓϨʔτΤϯδϯΛؚ·ͳ͍ • PhpStormʹΑΔܕਪ࿦ͷ࠷େݶ׆༻ • ϑΝΠϧ໊ͱϝιου໊ϕʔεͷϧʔςΟϯά

Slide 48

Slide 48 text

ルーターを自作する • name based routing͍ͨ͠ • ͋Ε…ҙ֎ͱͳ͍ͷͰ͸ • ͦΜͳ͸ͣ͸……

Slide 49

Slide 49 text

ϧʔλʔΛࣗ࡞͢Δ

Slide 50

Slide 50 text

[app]index.php を避けたい • php-fpm Λ͔ͭ͏ • dockerͳΒ͜Ε͔ͳ • apatchͰ΋͍͍͚Ͳ • .htaccessΛ͔ͭ͏ • php -S ͸ htaccess ʹରԠ͍ͯ͠Δʂ • php -S localhost:7777 -t public

Slide 51

Slide 51 text

[lib]なんかRouterっぽいものをつくる • new ͞Εͯ run()ɹ͞ΕͨΒ 
 ΞϓϦέʔγϣϯͷίϯτϩʔϥʔͷϝιουΛୟ͘ • $_SERVER["REQUEST_URI"]; ͱ͔͔ͭ͑ͦ͏ • new "\\hogehoge" ͱ͔͢Δͱάϩʔόϧείʔϓ 
 = ΞϓϦέʔγϣϯͷίʔυ͕ݺ΂Δ

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

[app] namespace Controllersを足す • composer.json ʹҎԼΛ଍͢ •

Slide 57

Slide 57 text

[app]HelloWorldController.php爆誕

Slide 58

Slide 58 text

[app]index.php • $route->run(); ͢Δͱ

Slide 59

Slide 59 text

໊લϕʔεͰಈ͘ʂ

Slide 60

Slide 60 text

໊લϕʔεͰಈ͘ʂ [app]->json() だけでおわりたい

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

͋ͱ͸஍ಓʹίʔυΛ ଍͍͚ͯ͠͹Ͳ͏ʹ͔

Slide 63

Slide 63 text

ςετΛॻ͘

Slide 64

Slide 64 text

PHPUnitしていく • composer require --dev phpunit/phpunit • test σΟϨΫτϦΛ੾Δ • PHPUnit\Framework\TestCase Λܧঝͨ͠ΫϥεΛ࡞Δ • ϝιου໊͸ test Ͱ࢝ΊΔ

Slide 65

Slide 65 text

気持ち

Slide 66

Slide 66 text

リファクタリング • new ͨ͠Β஋ݕࠪͰ͖ΔΑ͏ʹ͔ͨͬͨ͠ͷͰ

Slide 67

Slide 67 text

composer scriptを追加 • composer testͰ phpunit test Ͱ͖ΔΑ͏ʹͳΔ

Slide 68

Slide 68 text

いざ…… test 🎉 tada 🎉

Slide 69

Slide 69 text

GitHub Actions

Slide 70

Slide 70 text

͸ɺී௨ʹ……

Slide 71

Slide 71 text

packagist ΁ͷެ։

Slide 72

Slide 72 text

Packagist • ΞΧ΢ϯτͭ͘Δ • ϩάΠϯ͢Δ • Submit ϘλϯΛϙνοͱ • ࣗ෼ͷGitHub ͷϦϙδτϦͷURLΛೖΕͯSubmit

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

ΊͰͨ͠ɹΊͰͨ͠

Slide 76

Slide 76 text

ͩͱࢥ͏͡ΌΖʁ

Slide 77

Slide 77 text

unstable しかないと… • ϓϩδΣΫτ͕"minimum-stability": "dev", ʹͳ͍ͬͯͳ͍ͱ •

Slide 78

Slide 78 text

バージョンの打ち方 • composer.json ʹ version Λ௥Ճ͢Δ • λάΛଧͬͯpush͢Δ • git tag v0.0.1

Slide 79

Slide 79 text

composer require fruitriin/lucienne

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

[app]テンプレートリポジトリの作成 • ࠷খݶͷߏ੒Λͨ͠ app ͷϦϙδτϦΛ 
 ςϯϓϨʔτϦϙδτϦʹ͢Δ • ςϯϓϨʔτϦϙδτϦ͸ 
 .gitΛίϐʔͤͣclone͢Δ

Slide 82

Slide 82 text

ϫϯϙνͰఏڙʂ

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

No content

Slide 85

Slide 85 text

できたもの

Slide 86

Slide 86 text

No content

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

夢は広がる • Request, Response ͱ͔ • DB઀ଓΛϥοϐϯά • ORMͱ͔ • ϩάΠϯͱ͔ • Validationͱ͔

Slide 89

Slide 89 text

必要は発明の母 • ͱΓ͋͑ͣࣗ෼ͷ͍Βͳ͍΋ͷ͸͍Βͳ͍ • ΞϓϦέʔγϣϯΛॻ͘ʹ͋ͨͬͯ 
 ൚༻తͳ෦෼͕ϑϨʔϜϫʔΫʹͳΔ

Slide 90

Slide 90 text

まとめ • ΈΜͳΦϨΦϨͰ͖Δʂ • ΦϨΦϨ஥ؒ͸͍ͯ΋ΦϨͷ஥ؒ͸͍ͳ͍ • ܁Γฦ͠ݴ͏͕ྩ࿨ͩͧ • ChatGPT͸ͳΜͰ΋஌ͬͯͦ͏

Slide 91

Slide 91 text

Appendix • https://packagist.org/packages/fruitriin/lucienne • https://github.com/fruitriin/lucienne • https://github.com/fruitriin/Lucianne-application • ΦϨΦϨϑϨʔϜϫʔΫͷ࡞ΓํΛChatGPTʹฉ͍ͨϩάશ෦ • https://docs.google.com/document/d/e/2PACX-1vQDdc92Za3Shc9UgnD- oqpD3Mvo3rY7UEV_IuO2DG30jpc-tlwwOInG-8C2NCz6oBNhO9e_m-tXzZ7N/ pub

Slide 92

Slide 92 text

Inspired by • https://speakerdeck.com/uzulla/phperren-sheng-du- hahuremuwakuwozuo-tuteokou

Slide 93

Slide 93 text

Inspired by • https://speakerdeck.com/uzulla/gui-tutekita-ping-cheng-zui- hou-falseoreorehuremuwakufalsezuo-rifang

Slide 94

Slide 94 text

NGγʔϯू

Slide 95

Slide 95 text

App用Docker環境構築でハマり • ࠷ऴతʹphp -S ͰΑ͔ͬͨ • ϥΠϒϥϦ͸ phpunit ͔Β • ͦΕ͸ͦΕͱͯ͠Docker؀ڥ͸഑෍ߟ͑Δͱศར • ഑෍ͯ͠࢖ΘΕΔͷ͔ʁͱ͔͸ߟ͑ͯ͸͍͚ͳ͍ɻ 
 ຬ଍ײ͕େࣄ

Slide 96

Slide 96 text

最終的にできたのがこちら FROM wyveo/nginx-php-fpm:php81 COPY composer.json /usr/share/nginx COPY composer.lock /usr/share/nginx RUN chown -R nginx:nginx /usr/share/nginx WORKDIR /usr/share/nginx USER nginx RUN composer install --no-dev --no-scripts --no-autoloader && \ composer dump-autoload --optimize USER root • version: '3.9' services: web: build: . container_name: myapp ports: - '7777:80' volumes: - ./src:/usr/share/nginx/src - ./public:/usr/share/nginx/ html/ depends_on: - db networks: - myapp-net

Slide 97

Slide 97 text

mainブランチをPushしたぞ。で? • "minimum-stability": "dev", 
 "require": { 
 "fruitriin/lucienne": "dev-main" 
 }, • dev- ͱ͚ͭΔͱ main ϒϥϯνΛݟʹߦ͘

Slide 98

Slide 98 text

package名とリポジトリ名 • GithubͷϦϙδτϦ໊ͱcomposer.jsonͷname • Ұக͍ͯ͠Δඞཁ͸ͳ͍ • composer.jsonͷ autoload • Vender/PackageName: "src" ͱ͢Δͱ 
 namespace VencerPackageName; ͕ඞཁ

Slide 99

Slide 99 text

アプリケーションの名前空間を短くしたい • composer.json ͷ autoloadʹै͏ • { "Controllers\\": "src/Controllers" }

Slide 100

Slide 100 text

ͳͲͳͲͳͲ

Slide 101

Slide 101 text

ChatGPT͕͍͢͝

Slide 102

Slide 102 text

All powered by ChatGPT • ࠓճͷొஃʹ͓͍ͯɺ΄΅ChatGPTͱͷ΍ΓͱΓͰ׬݁ • ࣭໰ʹରͯ͠౴͕͑ฦͬͯ͘Δ • ஌Γ͍ͨ͜ͱΛϐϯϙΠϯτͰճ౴ͯ͘͠ΕΔ •

Slide 103

Slide 103 text

考古学を丸投げするスタイル

Slide 104

Slide 104 text

composer init の方法を教えてもらう

Slide 105

Slide 105 text

Hello Worldしたいです

Slide 106

Slide 106 text

autoloadとuse

Slide 107

Slide 107 text

AIʢ࢖͏ʣΤϯδχΞ࣌୅…

Slide 108

Slide 108 text

Any Ask or Questions?