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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
果物リン
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
190
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
140
embodied記憶の依代 聖杯問答/ Vessel of Memory: The Grail Dialogue #embodied_llm
fruitriin
2
240
ClaudeCodeと遠くへいくためのパーミッションルール/Stop Checking, Start Trusting: Claude Code Permission Rules
fruitriin
0
95
Claude Codeと物忘れ / Invitation talk about context - Why Claude Code forget?
fruitriin
0
130
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
290
Electron+Vue+Swift=真のデスクトップアプリ / How to create "Really" desktop app using Electron
fruitriin
0
160
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
190
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
1
180
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
230
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
140
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
220
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
280
Claude起点の仕様駆動開発
tanakaseiya
0
290
並行性の問題を防げ!実践トランザクション入門
occhi
0
150
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
160
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
110
AWS FinOps Agent 結局何が得意なの?
siromi
0
230
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
Git: the NoSQL Database
bkeepers
PRO
432
67k
KATA
mclloyd
PRO
35
16k
How Software Deployment tools have changed in the past 20 years
geshan
2
34k
The Curse of the Amulet
leimatthew05
3
15k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
260
Automating Front-end Workflow
addyosmani
1369
210k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
850
Raft: Consensus for Rubyists
vanstee
142
7.7k
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?