Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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͕͖ • PHP5ͿΓ • 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?