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
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.3k
それぞれの特徴から考えるフレームワーク選び
ippey
1
1.2k
Other Decks in Programming
See All in Programming
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
350
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
270
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.2k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
240
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
400
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
580
速習iPhone Duo対応
yuukiw00w
2
910
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
130
すこし踏み込む CancellationToken
htkym
2
1.5k
アクセシビリティから考える情報設計
high_g_engineer
0
430
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
540
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Agile that works and the tools we love
rasmusluckow
331
22k
A designer walks into a library…
pauljervisheath
211
25k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
YesSQL, Process and Tooling at Scale
rocio
174
15k
A Soul's Torment
seathinner
8
3.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Discover your Explorer Soul
emna__ayadi
2
1.3k
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Ͱಥ͖௨͢ͷͳ͠Ͱͳ͔ͬͨɻ • ͨͿΜɺͬͱ͖Ε͍ʹͰ͖Δ
ࢼ࣌ͦ͢͜ɺΞʔΩςΫνϟΛҙࣝ͢Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ