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
SymfonyとDoctrineで 簡単クリーンアーキテクチャ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ippei Sumida
October 03, 2021
Programming
35k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SymfonyとDoctrineで 簡単クリーンアーキテクチャ
2021/10/02, 03に開催されてPHP Conference Japan 2021の登壇でお話ししたスライドです。
#phpcon2021 #phpcon #php
Ippei Sumida
October 03, 2021
More Decks by Ippei Sumida
See All by Ippei Sumida
DROBEの生成AI活用事例 with AWS
ippey
0
330
みんなでQAしてる話
ippey
0
190
AIで生成したものをAIでチェックしてる話
ippey
0
2.4k
『WordPressコミュニティで学ぶ』OSS貢献の多様性
ippey
0
1.4k
25分で理解する!Symfonyの魅力とその実践的活用法
ippey
1
7.9k
素早いバリュー提供のための DROBEの新戦略
ippey
0
1.5k
Symfony 6.3のおすすめ新機能まとめ
ippey
1
2.2k
PhpStorm + GitHub Copilotはいいぞ
ippey
0
3.2k
それぞれの特徴から考えるフレームワーク選び
ippey
1
1.2k
Other Decks in Programming
See All in Programming
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
0
160
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
200
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
100
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
570
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
速習iPhone Duo対応
yuukiw00w
1
350
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
6
1.9k
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
490
Optimising Largest Contentful Paint
csswizardry
37
4k
Everyday Curiosity
cassininazir
0
320
The Curious Case for Waylosing
cassininazir
1
510
Faster Mobile Websites
deanohume
310
32k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
450
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Typedesign – Prime Four
hannesfritz
42
3.2k
Design in an AI World
tapps
1
320
Transcript
PHP Conference Japan 2021 Day2 SymfonyͱDoctrineͰ ؆୯ΫϦʔϯΞʔΩςΫνϟ ʙϓϩτλΠϐϯάʹͦ͜ΫϦʔϯͳTDD͕׆͖ͨʙ
֯ాɹҰฏ • ౡݝग़ɺେࡕࡏॅ • ϑϦʔϥϯε Webσϕϩούʔ • Symfony Meetup KansaiӡӦ
ίϛϡχςΟ׆ಈͬͯ·͢ WordCamp Osaka 2019 ippei Wapuu sukisuki
ͨͳ͔ɹͻͯ͞Δ • ಉ͘͡େࡕͷ PHPer Ͱ͢ • ͜ͱݚڀॴɾॴ • ͳ͔ͥωοτͱٕज़ࢽͰϚϯΨ Λඳ͍͍ͯ·͢
SoftwareDesign PHP ΧϯϑΝϨϯε௨৴
• Symfony+DoctrineͰΫϦʔϯΞʔΩςΫνϟͳ࣮Ҋ݅ΛͬͨΑ • Symfony, Doctrine, ΫϦʔϯΞʔΩςΫνϟ֓ཁ • ͳʹΛͲͷΑ͏ʹ࡞͍͔ͬͯͬͨ • Symfony,
Doctrine, ΫϦʔϯΞʔΩςΫνϟ·ͰͷOOP • ৄࡉͳίʔυͷઆ໌ ↑͓͠͠·͢ ↓ׂѪ͠·͢ ࠓ͓ͳ͢͠Δ༰
͜ͱͷ͡·Γ
͋͟·͢ʔʂΓ·͢ʔʂ ϓϩτλΠϓͭ͘Δ͓ࣄ͋ΔΜͰ͕͢ɺͲ͏Ͱ͔͢ʁ ͍ͬ͠ΐʹͲ͏Ͱ͔͢ʁ
ࠓճͷҊ݅֓ཁʢԾʣ ϦΞϧλΠϜಈը৴αʔϏεͷϓϥοτϑΥʔϜ ར༻اۀA ར༻اۀB AͷϢʔβʔ BͷϢʔβʔ Ϛελʔίϯςϯπ ൪දA ൪දB ೝূɾ৴
: ͏ͦͰ
͍͟ϓϩτλΠϐϯά ͦͷલʹ
։ൃํͷ૬ஊɺࡦఆ #1
Ͱ͢Ͷʔɻ ͱΓ͍͋͑ͣͬͨΜू·Γ·͔͢ʁ
·ͣཁٻ֬ೝ • ͍͍ͨͩͨཁٻΛ֬ೝ • ͦΕΛͲͷΑ͏ͳٕज़ɺํ๏Ͱ࡞͍͔ͬͯ͘૬ஊ
֎෦αʔϏεͱ͔ɺԿ͏͔Θ͔Βͳ͍Ͱ͢͠Ͷʔ ͍ͬ͡͞ޙͰͲ͏มߋ͞ΕΔ͔Θ͔Μͳ͍ͷͰɺ ͳΔ͘ૉͷPHPͰ͔ͨΊ·͠ΐ͏͔ɻ Ͱ͋Εɺ͜ͷΞʔΩςΫνϟ͍ͬͯΈ·͔͢
ΫϦʔϯΞʔΩςΫνϟ ઃܭํ Λ࠾༻
؆୯ͳΫϦʔϯΞʔΩςΫνϟͷઆ໌ • ґଘํΛ෦ʹ͔͏Α͏ʹ͚ͯͶ • ҎԼͷ༷ʹ࣮Λ৺͕͚ΔͱΑ͍Α • EntitiesʢԫʣʹυϝΠϯϞσϧΛ • Use Casesʢʣʹۀͷػೳཁ݅Λ
• ControllersʢʣʹӬଓԽͱೖग़ྗΛ • Devices / DB / UIʢ੨ʣʹٕज़తͳԼࢧ͑ϑϩϯτΤϯυΛ • ্هͷ࡞ΓํΛνʔϜͰҙࣝͯ͠࡞ΔͱΈΜͳ͕ͤͩΑ • มʹݻࣥ͠ͳ͍Α͏ʹ͖Λ͚ͭͯͶ
֎ଆ ٕज़Λϓϩάϥϛϯά͢Δͱ͜Ζ ը໘ετϨʔδͳͲ ଆ ۀΛϓϩάϥϛϯά͢Δͱ͜Ζ ݴޠʹΑΔ७ਮͳϩδοΫ ͖Ε͍ʹอ͍ͪͨ ґଘํ DIPΛ׆͔ͯ͠ଆ͔Β֎ଆґଘ͠ͳ͍Α͏ʹ use
implement 🙅
ͳ͖ͥΕ͍ʹอ͍ͪͨʁ • ۀʹΑٕͬͯज़͕มΘΔͷΑ͋͘Δ͜ͱ • ۀϩδοΫ͕ٕज़ʹґଘ͍ͯ͠Δͱɺٕज़ͷӨڹͰۀϩδοΫ͕มΘΔ ͜ͱʹͳΔ ۀϩδοΫ͕ෳࡶʹͳΔݪҼΛݮΒ͍ͨ͠
֎ଆ ଆ ϩάΛMySQLʹอଘ ྫɿμʔςΟʔͳϩάอଘ ϩάMySQLʹอଘ MySQL ❓
֎ଆ ଆ ϩάΛDynamoDBʹอଘ ྫɿμʔςΟʔͳϩάอଘ DynamoDBʹม͑·͢ ۀϩδοΫΛ मਖ਼͠ͳ͍ͱ͍͚ͳ͍ DynamoDB MySQL
❗❓
֎ଆ ϩάΛMySQLʹӬଓԽ ଆ ϩάσʔλΛ࡞͢Δ ґଘํ ྫɿΫϦʔϯͳϩάอଘ ϩάMySQLʹอଘ
֎ଆ ϩάΛDynamoDBʹӬଓԽ ଆ ϩάσʔλΛ࡞͢Δ ґଘํ ྫɿΫϦʔϯͳϩάอଘ DynamoDBʹม͑·͢
SymfonyͰ͔͢Ͷʔ ͳΔ͘ૉͷPHPͰݻΊΔͳΒɺϑϨʔϜϫʔΫ
όοΫΤϯυ ϑϩϯτΤϯυ
ͳͥSymfony+Doctrine?
ͳͥSymfony + DoctrineΛબΜ͔ͩ • ཁٻ͕ΦϒδΣΫτΛෳίϯςΩετͰฤू͠Α͏ͱͯ͠Δ • ActiveRecordͩͱΫϥε͕ංେͯͪ͠ΐͬͱେม͔͠Εͳ͍ • Doctrine
Data Mapper ܕͷ ORM →ϑϨʔϜϫʔΫͱಠཱͨ͠ϥΠϒϥϦ͔ͩΒ →Entity ͕ POPO ͳͷͰҙਤͤͣDB͕ಈ͘৺͕ͳ͍ • ΦʔτϫΠϠϦϯάͰඞཁͳΫϥεΛࣗಈͰೖͰ͖Δ • ඞཁʹͳͬͨ࣌ͰɺػೳΛίϯϙʔωϯτͱͯ͠ΠϯετʔϧͰ͖Δ
Data Mapper ܕ v.s. Active Record ܕ id=1 id=4 id=1
id=4 id=4 id=1 id=1 id=1 id=4 ࢀর ίϐʔ ૢ࡞ ૢ࡞ ϏδωεϩδοΫ ->save() -> f lush() Ԇ ϑΣον Entity Manager ಉظ ->save() ->save() ίϯτϩʔϥʔ ΫΤϦ͝ͱʹҟͳΔΠϯελϯεੜɻ ΠϯελϯεʹҰҙੑ͕ͳ͍ɻ != Entity DB ࣮ମ͕ͳ͍ͱ߹ੑ͕Γཱͨͳ͍ɻ ϏδωεϩδοΫ͕ʮDBอଘʯΛ࣋ͭɻ ͯ͢ͷ Entity ԾతʹΦϯϝϞϦͰ Γͳ͍ͷ͚ͩΛԆϑΣονɻ Repository ࢀরΛఏڙ͢Δ͚ͩɻ ϏδωεϩδοΫOOP͚ͩͰ݁͢Δɻ ࠩSQLੜ
Symfony ͷΦʔτϫΠϠϦϯά • ΦʔτϫΠϠϦϯά = DI ͷઃఆʹొ͠ͳ͍Φϒ δΣΫτͰɺܕએݴʹ߹͏ΦϒδΣΫτΛࣗಈత ʹೖͯ͠ੜ͢Δػೳ •
Laravel ͳͲଟ͘ͷ PHP จԽͰʮఆٛ͞Εͨͷ ͷத͔Βదͨ͠ͷʯΛೖ͢Δ͜ͱ • Symfony ͷ߹ɺݸผఆ͍ٛͯ͠ͳ͍ΫϥεͰ ೖ͢ΔΦϒδΣΫτʹͳΕΔ!! • → ೖʮ͞ΕΔଆʯͱʮ͢Δͷʯͷ۠ผ͕ෆཁͳ ͷͰɺؾܰʹґଘΛνΣʔϯ͢Δઃܭ͕Ͱ͖Δ ͜͜ʹ͋ΔΫϥε (ྫ֎Λআ͍ͯ) ͥΜͿ ࣗಈͰґଘղܾͨ͠Ζ
։ൃڥ ޙʹඞཁʹͳͬͨͷͰՃ
͜͜·Ͱ·ͱΊ • ϓϩτλΠϓΛ࡞Δʹ͋ͨͬͯɺཁٻΛ֬ೝ • ༻͢ΔϞσϦϯάٕ๏ɺϑϨʔϜϫʔΫΛબఆ • ͳΔ͘ૉͷPHPͰϏδωεϩδοΫΛ։ൃ͍ͯ͘͜͠ͱΛ֬ೝ
ϖΞϓϩͰσϞ։ൃ #2
Ͱ͢Ͷʔɻ ͜ͷํͰͲ͏ͬͯ࡞͍͔ͬͯ͘ɺҰϖΞϓϩ͠·͠ΐ͏͔ɻ
։ൃର mapping
͔ͤͬ͘ͳΜͰɺΦϯϥΠϯͰ͜ΕˢͬͯΈ·ͤΜʁ
Symfony CLI ͍Ζ͍Ζ࡞ۀͷ͓ख͍ • symfony ( php | pecl |
composer | console … ) .php-versionͰࢦఆͨ͠PHPͷόʔδϣϯͰίϚϯυΛ࣮ߦ ෳόʔδϣϯͷPHP͕ೖ͍ͬͯΔ࣌ศརʂ • symfony server:start -d ϩʔΧϧWebαʔόʔىಈɻ docker-compose.ymlͷ༰͔ΒڥมΛੜ
Symfony CLI + Symfony Console ͍Ζ͍Ζ࡞ۀͷ͓ख͍ • symfony console make:”࡞Γ͍ͨͷ”
ΤϯςΟςΟɺίϯτϩʔϥʔʢ&ςϯϓϨʔτʣͳͲͷ࡞Οβʔυ • symfony console doctrine:schema:update —force ΤϯςΟςΟΫϥεͱDBͷࠩҟΛௐɺςʔϒϧߏΛߋ৽ • Symfony console doctrine:migrations:di ff ΤϯςΟςΟΫϥεͱDBͷࠩҟΛௐɺϚΠάϨʔγϣϯϑΝΠϧΛ࡞
1. ΤϯςΟςΟ࡞ উखʹೖΕͯ͘ΕΔ ͋ͬͯͳͯ͘ςετͷಈ࡞ʹ ؔͳ͍͔Βͦͷ··͍࣍͜͏
2. ςετ࡞ (PHPUnit) ࢦఆͨ͠༰ͰΤϯςΟςΟ͕ ࡞ΒΕΕ0,
3. Ϣʔεέʔε࡞
3-a. ςετௐ ύεϫʔυϋογϡԽΛϞοΫ ࢦఆͨ͠༰ͰΤϯςΟςΟ͕ ࡞ΒΕΕ0,
None
4. WebαʔϏεʹΈࠐΈ ϧʔςΟϯά ࡞ͬͨϢʔεέʔε
5. ϑϩϯτ࡞ (TypeScript+JSX)
None
Ͱ͢Ͷʔɻ ͳΜ͔͍͚ͦ͏Ͱ͢Ͷɻ
͜͜·Ͱ·ͱΊ • ࣮ࡍʹબఆͨ͠ͷ͕ػೳ͢Δ͔খ͘͞࡞ͬͯࢼ͢ͱ٢ • ΫϦʔϯΞʔΩςΫνϟΛҙࣝͯ͋͠ΔఔΫϥε࡞ • ͜͜ͰTDDɻ • Ϣʔεέʔεʹରͯ͠ςετΛهड़ •
DBʹอଘ͠ͳ͍ͷͰɺEntity͕Ͱ͖ΕOK • ϖΞϓϩʹCode with Me͕ศརͰͨ͠
Ϩοπϓϩτʂ #3
ϓϩτͰ࡞ΔετʔϦʔΛચ͍ग़͠·͠ΐ͏͔
ϢʔβʔετʔϦʔϚοϐϯά
ϢʔβʔετʔϦʔϚοϐϯάͱ • ϢʔβʔͷετʔϦʔΛ࣌ܥྻͰચ͍ग़͠ɺ༏ઌΛ͚͍ͭͯ͘ • ϓϩδΣΫτࢀըऀશһͰ࣮ࢪ • ࣌ܥྻɾ༏ઌͰཧ͢Δ͜ͱͰɺҎԼΛѲ͢Δ • ։ൃॱংʢ·ͣͲ͜ʹྗ͢Δඞཁ͕͋Δ͔ʣ •
ൈ͚࿙Ε͕ͳ͍͔ • ϓϩδΣΫτʹࠐΊͨࢥ͍ʢΊ͋ͯʣ
༏ઌ ༏ઌߴ Ϣʔβ࣌ܥྻ اۀొ ϓϥϯ࡞ ϓϥϯҰཡ اۀฤू … اۀใΛొ දऀΛొ
ࢧ͍ํ๏Λ ొ ࣄલϓϥϯ͔Β ࡞ ProgramΛ Ճ ΧελϚΠζ ͯ͠࡞ ϓϥϯҰཡΛ Ӿཡ ϓϥϯͷৄࡉΛ Ӿཡ اۀใΛฤू ࢧ͍ํ๏Λ ฤू … Twitterͱ࿈ܞ ઈରඞཁ ૣΊʹཉ͍͠ ٸ͗Ͱͳ͍ ϓϩτ։ൃର ϢʔβΛొ දऀΛฤू ˞ಛʹॏཁͳՕॴͷΈ
Γΐ͏͔͍Ͱ͢ʔ Ͱ؆୯ͳϞσϦϯά͍͖ͯ͠·͠ΐ͏͔ ·ͣEntityͷચ͍ग़͔͠Βʙ
ॳظͷཁٻ༷ʢԾʣ • ܖ๏ਓࣗͷ৴αΠτͰ৴͠์ • ऩࡁΈͷίϯςϯπ୯ҐΛʰϓϩάϥϜʱͱݺͿ • ϓϩάϥϜΛ৴νϟϯωϧͷʰϓϥϯʱʹฒΔ • ৴ऀϓϥϯΛΧελϚΠζͰ͖Δ •
৴αΠτϓϥϯΛෳνϟϯωϧઃ͚Δ͜ͱͰ͖Δ • ӡӦ͔Βࣄલఆٛ͞Εͨϓϥϯ͕ఏڙ͞ΕΔ • ࢹௌऀΞΫλʔϓϩάϥϜ୯ମͷΞʔΧΠϒΛ؍Δ͜ͱ͕Ͱ͖Δ : ͏ͦͰ
None
͋ʔͦ͏͔ͦ͏͔ɻ͡Όɺ͜ΕεΫϦʔϯͬͯײ͡Ͱ͔͢Ͷʁ ͳΜ͔ཁͷ༻ޠ͕͔ͭΈͲ͜Ζͳ͍ͳ͋ɻ ͜Ε࣮͕ͬͯ͋ͬͨ͠ΒөըؗΈ͍ͨͳͷͰʙ ϐϯͱ͖·ͨ͠Ͷʙɻ͜͜Ͱ͢Ͷ… ΈΜͳ༻ޠΛ औΓҧ͑Δ
࣮ମΛΠϝʔδͰ͖Δͷʹஔ͖͑Δ ※ Մࢉ໊ࢺʹ͢ΔͱΦϒδΣΫτʹ͍͢͠
None
͜͜؆୯ʹݴ͑͜͏͍͏͜ͱͰ͢ΑͶʔ ͜Εͬͯɺཁ͜͏͍͏͜ͱͰ͢ΑͶʔʢ࡞ͨ͠ਤΛݟͳ͕Βʣ Ͱ͢Ͷʔ ϞσϦϯάͨ݁͠ՌΛશһʹڞ༗ ୭ޡղ͠ͳ͘ ͳͬͨ 💯
Γΐ͏͔͍Ͱ͢ʔ ͭ͗ϢʔεέʔεͷϞσϦϯά͠·͠ΐ͏͔ʔ ͰϢʔβʔετʔϦʔϚοϐϯάͷʙ͔ΒखΛ͚ͭ·͠ΐ͏
None
͍͞͠ΐʹͲ͏ͬͯ࡞Δ͔͠߹ͬͨͷ͕ޮ͍ͯ·͢Ͷ ͍͞͠ΐʹ૬ஊͯ͠࡞ͬͨϨΠϠʔʹ͋Θ͍ͤͯ͘ͱ͜Μͳײ͡Ͱ͔͢Ͷ Ͱɺίʔυʹམͱͯ͠Έ·͔͢…
өըؗͰձһొ͢Δײ͡Ͱ͢ΑͶʔ ϢʔβՃ͢Δͱɺ͜͏ͳΔͬͯ͜ͱͰ͢ΑͶʢ࣮ߦ݁ՌΛݟͳ͕Βʣ Ͱ͢Ͷʔ ίʔυʹམͱͨ݁͠ՌΛશһʹڞ༗
Ͱ͢Ͷʔ ͡ΌɺϝʔϧΛૹͬͯɺϢʔβ͕ඞཁͳใೖྗͨ͠ΒొͰ͢Ͷʔ ࣮ࡍϢʔβʹԾొϝʔϧૹΔ͔Μ͡Ͱ͔͢Ͷʔ ೝࣝ߹Θͤͳ͕ΒϒϥογϡΞοϓ͢ΔՕॴΛ֬ೝ
ͳͷͰɺϢʔβͷσʔλ͜Μͳײ͡Ͱ͓࣋ͬͯ͘ͷͲ͏Ͱ͔͢ʁ ͋ͬɺ͔ͨ͠͠Β͜Μͳӡ༻χʔζ ͋Μͳӡ༻χʔζ͕ग़ͯ͘Δ͔ɻೝূΞΫλʔ͝ͱʹ͚ͣɺ ΈΜͳڞ௨͕߹ྑ͍ͱࢥ͏ΜͰ͕͢Ͳ͏Ͱ͔͢ʁ ͳΔ΄Ͳʔ ࡞࣌ͷؾ͖ͮΛϑΟʔυόοΫ
ίʔυͷՃɾมߋɾഁغ͕ଟൃ ࡞࣌ͷؾ͖ͮΛϑΟʔυόοΫ ʹ
͜͜ͰSymfony + Doctrine͕׆༂!
͜͜ͳ ϢʔεέʔεDBอଘॲཧΛ࣋ͨͳ͍ʂ 4BWFΛݺͿ͡Όͳͯ͘ʮಉظ͢ΔʯΠϝʔδɻϢʔεέʔεʮอଘʯΛҙࣝ͠ͳ͍͍͔ͯ͘Β͍͡Γ͍͢ɻ
ʮςʔϒϧ͔Βʙͳσʔλऔಘ͢Δ͜ͱͳʂʯͰςετͰ͖Δɻ ςετͰͷDBݕࡧϞοΫͰ༻Մʂ
Ͱ͢Ͷʔ ίʔυ͔͠৺͠ͳ͍͍ͯ͘ͷָɻβΫβΫͬͪΌ͍·ͨ͠ɻ ͳΜ͔͍͚ͦ͏Ͱ͢Ͷ
ϞσϦϯά ςετ࡞Δ ։ൃ ςετௐ ΈΜͳʹڞ༗ɾϑΟʔυόοΫ ʰϞσϦϯάˠڞ༗ʱ Λ܁Γฦͯ͠ɺ ϓϩτΛ࡞ σϞɾྃ
͍Ζ͍Ζ͋ͬͨ͜ͱ
ϑϩϯτΤϯυͷਓ͕ͳ͔ͳ͔Έ͔ͭΒͳͯ͘…
͜ΕɺTwigʹ͍͍ͯ͠Ͱ͔͢Ͷʁ PHPer ͩͦ͠ͷํ͕εϐʔυग़·͢ΑͶɻ ϢʔεέʔεมΘΒͳ͍͠ࢍʙ
όοΫΤϯυ
Γ͍ͨ͜ͱΑΓݟͤΔ͜ͱʹྗ • ૣ͘࡞ͬͯɺૣ͘ϓϩτݟ͍ͤͨͷͰ׳ΕͯΔٕज़ʹγϑτͨ͠ ※ ߹ʹΑΔ • Next.jsʢ& TypeScriptʣͷຽͰͳ͔ͬͨͷͰɺ͕ࢥ͍ͷ֎ग़ͳ͔ͬͨ ͷ͋Δɻ
ϢʔεέʔεʹRepositoryʢςʔϒϧʣ͕ͲΜͲΜ͍ͬͯ͘͞ͳʔ…
ར༻͢Δςʔϒϧ͚ͩҾ͕૿͑Δ…
ඞཁͳςʔϒϧ͕૿͑Δ͝ͱʹɺมߋ͕ඞཁ ແବʹςετͷमਖ਼͕૿͑ͯ͠·͏…
͜Εɺࠓ͑Ε·͚͢Ͳޙʑ͠ΜͲ͘ͳΓ·͢Ͷʔ ͻΒΊ͍ͨ
%BUB4FSWJDF*OUFSGBDFΛ ͭ͘Δ %BUB4FSWJDFͰ ࣮ 4FSWJDFͰ3FQPTJUPSZΛ ར༻
Repositoryʢςʔϒϧʣʹґଘ͠ͳ͍࡞Γʹʂ
ΦʔτϫΠϠϦϯά ࣮Ϋϥεʹ͖ͳ͚ͩRepositoryΛૠͤΔ
ʮ%#͔Βʙͳσʔλऔಘ͢Δ͜ͱͳʂʯͰςετͰ͖Δɻ ςετͷमਖ਼ෆཁʹʂ ςʔϒϧ͕૿͑ͯมߋͷඞཁ͕ͳ͍
DBͱͷΓͱΓΛServiceʹ·ͱΊΔ • Ϣʔεέʔε͝ͱʹDBͷΓͱΓΛInterfaceͱͯ͠ఆٛ͢Δ • ϦϙδτϦ܈Λ·ͱΊΔϑΝαʔυͷײ͡ • ςετͷमਖ਼ָʹͳΔ • ͜͜SymfonyͷΦʔτϫΠϠϦϯά͕େ׆༂ʂ
ʢը໘ʴίϯτϩʔϥʔɺؒʹ߹͏͔ͳʔ… Ϣʔεέʔεॱௐͦ͏Ͱ͚͢Ͳɺը໘पΓେৎͰ͔͢ʁ ։ൃظؒͦΖͦΖऴ൫Ͱ͢͠ɺ࡞͍͖ͬͯ·͢Ͷʔ
ͳΜ͔ɺ͜ΕΊͬͪΌૣ͘࡞Εͯٯʹෆ҆ͳΜͰ͚͢Ͳ… ࢥͬͯͨҎ্ʹ໎͏͜ͱͳ͍Ͱ͢Ͷ ։ൃத
ೖྗΛ༻ҙ͢Δ ϢʔεέʔεΛ͏ ݁ՌΛ֬ೝ͢Δ ೖྗΛड͚औΔ ϢʔεέʔεΛ͏ ݁ՌΛը໘දࣔ͢Δ Ϣʔεέʔεςετ ίϯτϩʔϥʔʴը໘ ͕͜͜มΘ͚ͬͨͩ DBͱಉظ
ೖྗΛ༻ҙ͢Δ ϢʔεέʔεΛ͏ ݁ՌΛ֬ೝ͢Δ ೖྗΛड͚औΔ ϢʔεέʔεΛ͏ ݁ՌΛը໘දࣔ͢Δ Ϣʔεέʔεςετ ίϯτϩʔϥʔʴը໘ ͕͜͜ΫϦʔϯͳ΄Ͳɺ
ίϯτϩʔϥʔͰΔ͜ͱ͕গͳ͍ DBͱಉظ
͋ͱͰɺͦͦͬ͘͜͜͞ΓೖΕΔ͜ͱͰ͖ΔΜͰେৎͰ͢Αʂ ͜ͷϖʔδೝূޙͷϖʔδͳΜͰ͕͢ɻ ࠓΠϝʔδڞ༗Λ༏ઌͯ͠ΔͷͰɺೝূͬ͢ͱͯ͠·͢
ೖྗΛड͚औΔ ϢʔεέʔεΛ͏ ݁ՌΛը໘දࣔ͢Δ ίϯτϩʔϥʔʴը໘ DBͱಉظ Ϣʔβೝূ͢Δ ͜ΕΛՃ
ࠓݟͯΔਓ͕ݟͨ͜ͱ͋Δ͔Λ Δʹೝূ͕͍Δ ݟͨ͜ͱ͕͋Δ
ೖྗΛड͚औΔ ϢʔεέʔεΛ͏ ݁ՌΛը໘දࣔ͢Δ ίϯτϩʔϥʔʴը໘ DBͱಉظ Ϣʔβೝূ͢Δ ඞཁʹͳͬͨ࣌Ͱૠೖ
ೝূΛ͔͚Δॴ ೝূͷઃఆ ରϢʔβͷઃఆ
͜ΕΛͱʹຊ։ൃʹ͏ͭΕΔͱࢥ͍·͢ɻ ϓϩτ͜Μͳײ͡Ͱ͢ େ·͔ͳ༻ײ՝ݟ͖͑ͯ·ͨ͠ɻ
ϓϩτ։ൃྃ🎉
ΫϦʔϯΞΩςΫνϟ …ͬͯԿͳͷʁʲ࠶ʳ ͪΐͬ͜ͱͻͯ͞Δ͞Μίʔφʔ ޠΒͤͯ
ΫϦʔϯΞΩςΫνϟந • ͜Ε͚ͩಡΊ: https://blog.tai2.net/the_clean_architecture.html • > هࣄ಄ͷਤɺ͜ΕΒ (ΦχΦϯϔΩαΰφϧͳͲ) ͷΞʔΩ ςΫνϟΛ୯Ұͷ֓೦ʹແཧͳ͘౷߹͢ΔࢼΈͰ͋Δɻ
• ಉ৺ԁͷਤͨͩͷྫͰ͔͠ͳ͍ɻ ΦχΦϯΞʔΩςΫνϟͱ΄΅ಉ͡ਤ → • ΦχΦϯ/ϔΩαΰφϧ/DCI/… ʹ ۩ΞʔΩςΫνϟ • ΫϦʔϯΞʔΩςΫνϟ = ΞʔΩςΫνϟͷσβΠϯύλʔϯ
ΫϦʔϯΞΩςΫνϟஔਤͰͳ͍ • ༏ΕͨΞʔΩςΫνϟʹڞ௨͢Δಛ: ✓ த৺΄ͲϏδωεͷຊ࣭ ✓ ֎प΄Ͳίϯϐϡʔλʔͷࣄ ✓ จ຺Λม͢ΔΞμϓλʔͩ ✓
ґଘΛͭͶʹத৺ͷ҆ఆʹ͚Δ • ʮ͜ΕͲΜͳΞʔΩςΫνϟʹৗࣝͳʯ • ʮͪΖΜ܅Β͕ࣗͷϓϩμΫτʹ࡞ΔΞʔΩςΫνϟʹͰʯ
.ϑϨʔϜϫʔΫΠϯϑϥετϥΫνϟ͔ • ΫϦʔϯΞΩςΫνϟຊʹʮWeb ϑϨʔϜϫʔΫ֎ଆʯͱॻ͍ͯ͋Δ • Ͱૄ݁߹ͳઃܭΛαϙʔτ͢ΔͨΊͷϑϨʔϜϫʔΫ͋Δ • ಉ͡ϑϨʔϜϫʔΫͱ͍͏໊ͰͦΕͧΕΧόʔൣғ͕શ͘ҧ͏ • Կ͕ґଘͯ͠Α͍҆ఆ֓೦͔ɺԿ͕ෆ҆ఆ͞Λট͘۩ͳͷ͔ΛݟۃΊΑ
• ḏࢠఆنʹΞʔΩςΫνϟਤͷܗ௨Γʹ͢Δྗແବ
·ͱΊ
͜Μͳϓϩτͷ࡞ΓํͰͨ͠ #1 ։ൃํܾఆ ܾΊͨ։ൃํʹݻࣥ͠ͳ͍Α͏ʹ #2 ํ֬ೝ ظ௨Γ͔খ͘͞ࢼ͢ #3 ετʔϦʔϚοϐϯά ϓϩμΫτͷࢥ͍༏ઌͷߴ͍λεΫͷચ͍ग़͢
#4 ϞσϦϯάɺ։ൃɺϨϏϡʔ ϞσϦϯάʙϨϏϡʔΛ܁Γฦ͢ɻςετ͕ޮ͍ͯ͘Δ
ґଘํΛҙ͍ࣝ͢͠ Ϣʔεέʔεͷσʔλґଘ͕গͳ͍ ϞοΫ͕༻ҙ͍͢͠ ςετ͕खް͘ͳΔ ΦʔτϫΠϠϦϯάͰґଘղܾ Symfony + ɹDoctrineΛ͏͜ͱͰ ίʔυͷมߋʹڧ͍
⭕ Α͔ͬͨ͜ͱ • ࠷ॳʹߟ͑ͨʰ։ൃࢦʱʹΊΔ͜ͱͰ։ൃεϐʔυ͕ૣ͔ͬͨ • มߋʢ༷มߋɾϦϑΝΫλʣʹڧ͔ͬͨ • ʢࠓճͷܦݧΛܦͯʣ͖Ε͍ʹͭ͘Ζ͏ͬͯҙ͕ࣝժੜ͑ͨ Ϟσϧతʹίʔυతʹ
• ͜ͷޙͷຊ։ൃʹϓϩτͷίʔυ͕׆͖ͨ
✅ վળ • ։ൃʹ͍ͭͯͷυΩϡϝϯτΛ·ͱΊ͓͚ͯΑ͔ͬͨɻ • ຊ։ൃͰϑΝοτίϯτϩʔϥʔؾຯʹͳͬͨͷͰɺΞʔΩςΫνϟͷҙ ٛΛͪΌΜͱ͑ͳ͍ͱ؆୯ʹ่Εͯ͠·͏ • Ұ෦ɺυϝΠϯϩδοΫ͕ͬͪ͝Όʹͳͬͯ͠·ͬͨɻ •
ͬͱΠϕϯτʹཔΕΑ͔ͬͨɻ • Next.jsͰಥ͖௨͢ͷͳ͠Ͱͳ͔ͬͨɻ • ͨͿΜɺͬͱ͖Ε͍ʹͰ͖Δ
ࢼ࣌ͦ͢͜ɺΞʔΩςΫνϟΛҙࣝ͢Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ