Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore F...
Search
果物リン
March 24, 2023
Technology
200
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore Framework
ある日オレオレフレームワークを作りたくなった話
PHPerKaigi2023
果物リン
March 24, 2023
More Decks by 果物リン
See All by 果物リン
ADDF - ループエンジニアリングするフレームワークを作ったら/I Didn't Set Out to Build Loop Engineering, But ADDF Did
fruitriin
0
160
AIに与える人間らしさを(略)したら600ページの同人誌になった/I kept thinking about making AI more human, more, more, more... wait, when did this become a 600-page doujinshi?
fruitriin
0
150
記憶を高速で思い出す全文検索パフォーマンス・チューニング テクニック/How to make your AI recall, quickly
fruitriin
0
120
入社半年で作った"社内でも使える"ツール集/Everything I Built on the Side in Half a Year
fruitriin
0
130
embodied記憶の依代 聖杯問答/ Vessel of Memory: The Grail Dialogue #embodied_llm
fruitriin
2
230
ClaudeCodeと遠くへいくためのパーミッションルール/Stop Checking, Start Trusting: Claude Code Permission Rules
fruitriin
0
90
Claude Codeと物忘れ / Invitation talk about context - Why Claude Code forget?
fruitriin
0
110
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
280
Electron+Vue+Swift=真のデスクトップアプリ / How to create "Really" desktop app using Electron
fruitriin
0
160
Other Decks in Technology
See All in Technology
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
130
ソフトウェアDNAとクラウドエージェントのススメ
cloudace
0
110
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
2.7k
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
2
930
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
4
2.4k
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
0
250
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
3k
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
170
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
290
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
190
CLIライブラリ開発を支える技術
htnabe
0
120
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
Featured
See All Featured
From π to Pie charts
rasagy
1
370
Thoughts on Productivity
jonyablonski
76
5.4k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
エンジニアに許された特別な時間の終わり
watany
109
250k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Designing for Performance
lara
611
70k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Automating Front-end Workflow
addyosmani
1369
210k
Transcript
ある日 オレオレフレームワーク を作りたくなったぞ! ՌϦϯ@
[email protected]
ϑΝϯϑΝʔϨ גࣜձࣾ PHPerKaigi 2023 લࡇ 40
2023/3/23
One day....
Laravelʹର͢Δ ෩ͨΓ͕ڧ͍ͳ͋
ෆຬ͕͋ΔͳΒ ࣗͷཧΛ ͭ͘Ε͍͍ͷʹ
࡞Ε……͍͍ͷʹ……ʁ
ΦϨΦϨ͍ͯͧ͘͠ʂ
ྩͩͧʁ
自己紹介 果物リン@FruitRiin • ϑΝϯϑΝʔϨגࣜձࣾ • ݩPHPer, ݱϑϩϯτΤϯυΤϯδχΞ • Vue.js͕͖ •
PHP5ͿΓ • PHPͷΏΔ;Θʹߗ͘ॻ͚Δݴޠײେ͖ • ϑϨʔϜϫʔΫΛ࡞ͬͯΈͨ͘ͳͬͯ͠·ͬͨ
ファンファーレ株式会社 • ࢈ۀഇغۀքΛλʔήοτʹͨ͠SasS • ंʢγϑτදʣΉͷ͕৬ਓٕ • ͦΕɺITͰͳΜͱ͔ͳΒΜ͔ʁ • ཧ࠷దԽʢNot ػցֶशʣͰͳΜͱ͔͠·͠ΐ͏ʂ
数理最適化とは? • ੍ͱతͱ݅Λ͍ΕΔͱΓͷ݅ʹมͱͯ͠࠷దͳղ Λݟ͚ͭΔֶతख๏ • ιϧόͱ͍͏ΞϧΰϦζϜʹ ੍ͱతΛཧϞσϧʹͨ͠ͷΛ ݅มͱͱʹಥͬࠐΉͷ͕ं಄
• ϒϥοΫϘοΫεʹ͍݅ΕͯγΣΠΫͯ͠ग़ͨ͑Ͱͳ͍
の、フロントエンド担当やってます • ʢCM͜͜·Ͱʣ
お品書き(目次) • ༻ޠઆ໌ͳͲ • ͳͥΦϨΦϨϑϨʔϜϫʔΫੜ·Εͨͷ͔ʁ • ϥΠϒϥϦͷ࡞Γํపఈղઆ • ࠓ෩ͷϥΠϒϥϦͷ͍ํ
お品書き(目次) • ςετɺCIʢGitHubActionsʣ • Packagistͷެ։ • ·ͱΊ • Appendix
༻ޠઆ໌ͳͲ
用語説明 • ϑϨʔϜϫʔΫ • ΞϓϦέʔγϣϯιϑτΣΞΛ։ൃ͢ΔͨΊͷڞ௨తͳػೳ ϥΠϒϥϦɺઃܭύλʔϯɺϧʔϧͳͲΛ·ͱΊͨͷ • ΦϨΦϨ • ʮ͚ࣗͨͪͩͷɺಠࣗͷʯ
• ΦϨΦϨϑϨʔϜϫʔΫ • ࣗࣾ։ൃͷϑϨʔϜϫʔΫ
ҙ :CAUTION:
注意:現代のオレオレフレームワーク • ҰൠతʹϓϩμΫγϣϯʹೖ͢Δ͖Ͱ͋Γ·ͤΜ • อक͞Εͳ͍Մೳੑ͕ߴ͍ • ίϛϡχςΟͳͲͳ͍ • υΩϡϝϯτ͕උ͞ΕͯΔ͔࡞ऀͷؤுΓʹΑΔ •
ेதീͳ͍ • ηΩϡϦςΟͷΛͲ͏͢Δ • Ҿ͖ܧ͗Ͱ·Δ͝ͱϩετςΫϊϩδʔʹͳΔ
ࣺͯΑ͏ʂ
Breaking time
ͳͥΦϨΦϨϑϨʔϜϫʔΫ ੜ·Εͨͷ͔
オレオレフレームワーク考古学 • ຊͱWebΦϨΦϨϑϨʔϜϫʔΫͷؔΘΓ ϞόΠϧWebͷීٴͱڞʹ͋Δ(2000ॳ಄ʣ • i-Mode ͱ͔ ez-web ͱ͔
• ιγϟήͷొ • ૣ͘ɺ৭ʑͳΞϓϦέʔγϣϯΛ࡞Γ͍ͨ • ϑϨʔϜϫʔΫΛ࡞Ζ͏
有名どころなフレームワークの当時は? • CodeIgniterʢ2006ʣ • CakePHPʢ2005ʣ • Symfonyʢ2005ʣ • Zend Frameworkʢ2006ʣ
• Yii Frameworkʢ2008ʣ • Laravelʢ2011ʣ • ࣌·ͩଘࡏ͍ͯ͠ͳ͔͔ͬͨɺ ͜ͳΕ͍ͯͳ͔ͬͨ • ബ͍ϑϨʔϜϫʔΫΛϕʔεʹ ͚ࣗࣾʹΧελϚΠζͳͲ • ్த͔ΒҠߦඇৗʹࠔ
→ͨΓલͷΑ͏ʹ ΦϨΦϨ͍ͯͨ͠ʂ
Ruby on Rails の流行 • Ruby on Rails 2004ʹొ
• ຊͰ2000ޙʹٸʹීٴ • ͳΜͱ͍ͬͯ։ൃ͕؆୯Ͱૣ͍ • ͕ɺRubyͳͷͰαʔόʔΛݐͯΔͷ͕ͪΐͬͱΉ͔͍ͣ͠ • ࣌ίϯςφͱ͔ͳ͍͠Ͷʂ
Laravelの登場 • Laravelͷొ2011 • Ruby on RailsʹӨڹΛڧ͘ड͚ͨϑϨʔϜϫʔΫ • 2010ޙʹɺຊͰLaravelͷීٴ͕ਐΜͩ •
ͱ͍͏͔ೣḏࢠLaravelʹͳͬͨ
ͦͯ͠ྩͷݱʹࢸΔ... ˎͱ͍͏ௐࠪ݁Ռ
Ͱ࡞Γ͍ͨʂ
ΦϨΦϨ͍ͯͧ͘͠ʂ
ϥΠϒϥϦͷ࡞Γํ పఈղઆ
Composer init • PHPϓϩδΣΫτͷܗΛ࡞ͬͯ͘ΕΔ
[Lib]¥Hello Worldしにいく • srcσΟϨΫτϦʹHelloWorld.php • name vender/packagename • autoload
େจࣈখจࣈΛ۠ผ͠ͳ͍ • ύοέʔδ໊ͱҰகਪ
[Lib]HelloWorld.php • namespaceΛautoloadʹ͋ΘͤΔ • Ϋϥε໊ͱϑΝΠϧ໊Λ͋ΘͤΔ • େจࣈখจࣈΛ۠ผ͢Δ
どこからもコールされない • ϥΠϒϥϦͳͷͰͦΕͦ͏ • namespaceͱϑΝΠϧ໊ɺΫϥε໊͕͋ͬͯΕOK
[Lib]git push! • ϦϙδτϦʹpush͢Δ • ͱΓ͋͑ͣ Packagistͷొ͠ͳ͍
[App]呼んでみよう • ΞϓϦέʔγϣϯͷσΟϨΫτϦΛ࡞Δ • composer.jsonΛ࡞Δ • minimum-stability Λdevʹ • requireʹࣗͷύοέʔδΛ
[App]dev-main? • ௨ৗύοέʔδͷόʔδϣϯΛࢦఆ͢Δ • githubͷ߹ϒϥϯνΛࢦఆͰ͖Δ • dev- ϓϨϑΟοΫε͕ඞཁ • dev-main
όʔδϣϯ mainϒϥϯνͷ࠷৽Λͱͬͯ͘Δ
[App] sayHello()! • autoload Λ index.php Ͱݺͼग़͢ • use ͯ͠
new ͯ͠ • php -S localhost:7777
🎉 :tada: 🎉
面倒なときのライブラリ開発のコツ • Appଆ͔ΒvenderͷதͷlibͷίʔυΛ͍͡Δ • Ұ௨Γಈ͘͜ͱΛ֬ೝͨ͠ΒlibͷϦϙδτϦ
Ұ୴ٳܜ
ࠓ෩ͷϑϨʔϜϫʔΫͷ࡞Γํ
今風のフレームワークの作り方 • ϥΠϒϥϦ͕ଟ༷Խɺθϩ͔Βશ෦ॻ͘ඞཁͳ͍ • మ൘ͷ෦ϥΠϒϥϦ͔Βݟસ͍͍͑ • ͩ͜ΘΓ͍ͨ෦ΦʔμʔϝΠυ͍ͯ͘͠
͏ͣΒ͞Μͷ ʮؼ͖ͬͯͨʂ ฏ࠷ޙͷΦϨΦϨϑϨʔϜϫʔΫͷ ࡞Γํ ʯ Λݟͯ͘Εʂ
ライブラリによって得られるもの • ৴པͱ࣮ • ίϛϡχςΟ • ʮී௨ʯ
ϑϨʔϜϫʔΫͷίϯηϓτ
フレームワークのコンセプト • جຊJSON͔͠ฦ͞ͳ͍API ϑϨʔϜϫʔΫ • ςϯϓϨʔτΤϯδϯΛؚ·ͳ͍ • PhpStormʹΑΔܕਪͷ࠷େݶ׆༻ • ϑΝΠϧ໊ͱϝιου໊ϕʔεͷϧʔςΟϯά
ルーターを自作する • name based routing͍ͨ͠ • ͋Ε…ҙ֎ͱͳ͍ͷͰ • ͦΜͳͣ……
ϧʔλʔΛࣗ࡞͢Δ
[app]index.php を避けたい • php-fpm Λ͔ͭ͏ • dockerͳΒ͜Ε͔ͳ • apatchͰ͍͍͚Ͳ •
.htaccessΛ͔ͭ͏ • php -S htaccess ʹରԠ͍ͯ͠Δʂ • php -S localhost:7777 -t public
[lib]なんかRouterっぽいものをつくる • new ͞Εͯ run()ɹ͞ΕͨΒ ΞϓϦέʔγϣϯͷίϯτϩʔϥʔͷϝιουΛୟ͘ • $_SERVER["REQUEST_URI"]; ͱ͔͔ͭ͑ͦ͏
• new "\\hogehoge" ͱ͔͢Δͱάϩʔόϧείʔϓ = ΞϓϦέʔγϣϯͷίʔυ͕ݺΔ
None
None
None
None
[app] namespace Controllersを足す • composer.json ʹҎԼΛ͢ •
[app]HelloWorldController.php爆誕
[app]index.php • $route->run(); ͢Δͱ
໊લϕʔεͰಈ͘ʂ
໊લϕʔεͰಈ͘ʂ [app]->json() だけでおわりたい
None
͋ͱಓʹίʔυΛ ͍͚ͯ͠Ͳ͏ʹ͔
ςετΛॻ͘
PHPUnitしていく • composer require --dev phpunit/phpunit • test σΟϨΫτϦΛΔ •
PHPUnit\Framework\TestCase Λܧঝͨ͠ΫϥεΛ࡞Δ • ϝιου໊ test Ͱ࢝ΊΔ
気持ち
リファクタリング • new ͨ͠ΒݕࠪͰ͖ΔΑ͏ʹ͔ͨͬͨ͠ͷͰ
composer scriptを追加 • composer testͰ phpunit test Ͱ͖ΔΑ͏ʹͳΔ
いざ…… test 🎉 tada 🎉
GitHub Actions
ɺී௨ʹ……
packagist ͷެ։
Packagist • ΞΧϯτͭ͘Δ • ϩάΠϯ͢Δ • Submit ϘλϯΛϙνοͱ • ࣗͷGitHub
ͷϦϙδτϦͷURLΛೖΕͯSubmit
None
None
ΊͰͨ͠ɹΊͰͨ͠
ͩͱࢥ͏͡ΌΖʁ
unstable しかないと… • ϓϩδΣΫτ͕"minimum-stability": "dev", ʹͳ͍ͬͯͳ͍ͱ •
バージョンの打ち方 • composer.json ʹ version ΛՃ͢Δ • λάΛଧͬͯpush͢Δ • git
tag v0.0.1
composer require fruitriin/lucienne
None
[app]テンプレートリポジトリの作成 • ࠷খݶͷߏΛͨ͠ app ͷϦϙδτϦΛ ςϯϓϨʔτϦϙδτϦʹ͢Δ • ςϯϓϨʔτϦϙδτϦ
.gitΛίϐʔͤͣclone͢Δ
ϫϯϙνͰఏڙʂ
None
None
できたもの
None
None
夢は広がる • Request, Response ͱ͔ • DBଓΛϥοϐϯά • ORMͱ͔ •
ϩάΠϯͱ͔ • Validationͱ͔
必要は発明の母 • ͱΓ͋͑ͣࣗͷ͍Βͳ͍ͷ͍Βͳ͍ • ΞϓϦέʔγϣϯΛॻ͘ʹ͋ͨͬͯ ൚༻తͳ෦͕ϑϨʔϜϫʔΫʹͳΔ
まとめ • ΈΜͳΦϨΦϨͰ͖Δʂ • ΦϨΦϨ͍ؒͯΦϨͷ͍ؒͳ͍ • ܁Γฦ͠ݴ͏͕ྩͩͧ • ChatGPTͳΜͰͬͯͦ͏
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
Inspired by • https://speakerdeck.com/uzulla/phperren-sheng-du- hahuremuwakuwozuo-tuteokou
Inspired by • https://speakerdeck.com/uzulla/gui-tutekita-ping-cheng-zui- hou-falseoreorehuremuwakufalsezuo-rifang
NGγʔϯू
App用Docker環境構築でハマり • ࠷ऴతʹphp -S ͰΑ͔ͬͨ • ϥΠϒϥϦ phpunit ͔Β •
ͦΕͦΕͱͯ͠Dockerڥߟ͑Δͱศར • ͯ͠ΘΕΔͷ͔ʁͱ͔ߟ͍͚͑ͯͳ͍ɻ ຬײ͕େࣄ
最終的にできたのがこちら 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
mainブランチをPushしたぞ。で? • "minimum-stability": "dev", "require": { "fruitriin/lucienne": "dev-main"
}, • dev- ͱ͚ͭΔͱ main ϒϥϯνΛݟʹߦ͘
package名とリポジトリ名 • GithubͷϦϙδτϦ໊ͱcomposer.jsonͷname • Ұக͍ͯ͠Δඞཁͳ͍ • composer.jsonͷ autoload • Vender/PackageName:
"src" ͱ͢Δͱ namespace VencerPackageName; ͕ඞཁ
アプリケーションの名前空間を短くしたい • composer.json ͷ autoloadʹै͏ • { "Controllers\\": "src/Controllers" }
ͳͲͳͲͳͲ
ChatGPT͕͍͢͝
All powered by ChatGPT • ࠓճͷొஃʹ͓͍ͯɺ΄΅ChatGPTͱͷΓͱΓͰ݁ • ࣭ʹର͕ͯ͑͠ฦͬͯ͘Δ • Γ͍ͨ͜ͱΛϐϯϙΠϯτͰճͯ͘͠ΕΔ
•
考古学を丸投げするスタイル
composer init の方法を教えてもらう
Hello Worldしたいです
autoloadとuse
AIʢ͏ʣΤϯδχΞ࣌…
Any Ask or Questions?