Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore F...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
果物リン
March 24, 2023
Technology
190
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
130
AIに与える人間らしさを(略)したら600ページの同人誌になった/I kept thinking about making AI more human, more, more, more... wait, when did this become a 600-page doujinshi?
fruitriin
0
140
記憶を高速で思い出す全文検索パフォーマンス・チューニング テクニック/How to make your AI recall, quickly
fruitriin
0
110
入社半年で作った"社内でも使える"ツール集/Everything I Built on the Side in Half a Year
fruitriin
0
120
embodied記憶の依代 聖杯問答/ Vessel of Memory: The Grail Dialogue #embodied_llm
fruitriin
2
200
ClaudeCodeと遠くへいくためのパーミッションルール/Stop Checking, Start Trusting: Claude Code Permission Rules
fruitriin
0
80
Claude Codeと物忘れ / Invitation talk about context - Why Claude Code forget?
fruitriin
0
100
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
260
Electron+Vue+Swift=真のデスクトップアプリ / How to create "Really" desktop app using Electron
fruitriin
0
150
Other Decks in Technology
See All in Technology
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
8
7.6k
サイバー捜査員研修(後半)
nomizone
1
590
事業価値と Engineering 2026年度版
recruitengineers
PRO
28
14k
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
190
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
4
1.1k
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
1.6k
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
530
侵入は突然に 〜 IoTマルウェアと悪用される家庭の機器 ~ / When Intrusion Strikes: IoT Malware and the Abuse of Home Devices
nttcom
0
1.4k
新しい SLO が良い感じにハマっている話
z63d
4
2.1k
Goでデータパイプラインを作ろう
sansantech
PRO
0
230
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
0
820
Featured
See All Featured
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
460
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
270
Embracing the Ebb and Flow
colly
88
5.1k
Side Projects
sachag
455
43k
The Limits of Empathy - UXLibs8
cassininazir
1
580
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
630
Odyssey Design
rkendrick25
PRO
2
750
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
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?