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
SymfonyとDoctrineで 簡単クリーンアーキテクチャ
Search
Ippei Sumida
October 03, 2021
Programming
8
26k
SymfonyとDoctrineで 簡単クリーンアーキテクチャ
2021/10/02, 03に開催されてPHP Conference Japan 2021の登壇でお話ししたスライドです。
#phpcon2021 #phpcon #php
Ippei Sumida
October 03, 2021
Tweet
Share
More Decks by Ippei Sumida
See All by Ippei Sumida
みんなでQAしてる話
ippey
0
59
AIで生成したものをAIでチェックしてる話
ippey
0
2k
『WordPressコミュニティで学ぶ』OSS貢献の多様性
ippey
0
690
25分で理解する!Symfonyの魅力とその実践的活用法
ippey
1
6.5k
素早いバリュー提供のための DROBEの新戦略
ippey
0
1.3k
Symfony 6.3のおすすめ新機能まとめ
ippey
1
1.7k
PhpStorm + GitHub Copilotはいいぞ
ippey
0
2.3k
それぞれの特徴から考えるフレームワーク選び
ippey
1
880
なるべくJavaScriptを書かないで SymfonyのUIをリッチにする Symfony UX
ippey
1
1.8k
Other Decks in Programming
See All in Programming
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
Full stack testing :: basic to basic
up1
1
930
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
270
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
200
ドメインイベント増えすぎ問題
h0r15h0
1
170
Jakarta EE meets AI
ivargrimstad
0
230
선언형 UI에서의 상태관리
l2hyunwoo
0
140
Security_for_introducing_eBPF
kentatada
0
110
From Translations to Multi Dimension Entities
alexanderschranz
2
130
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Scaling GitHub
holman
458
140k
Being A Developer After 40
akosma
87
590k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Bash Introduction
62gerente
608
210k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Building an army of robots
kneath
302
44k
Writing Fast Ruby
sferik
628
61k
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Ͱಥ͖௨͢ͷͳ͠Ͱͳ͔ͬͨɻ • ͨͿΜɺͬͱ͖Ε͍ʹͰ͖Δ
ࢼ࣌ͦ͢͜ɺΞʔΩςΫνϟΛҙࣝ͢Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ