Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
SymfonyとDoctrineで 簡単クリーンアーキテクチャ
Ippei Sumida
October 03, 2021
Programming
8
2k
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
はじめてのCI - 実践編 -
ippey
1
47
はじめてのCI - 概要と準備編 -
ippey
0
140
小学生中学年向けプログラミング授業
ippey
0
39
functions.phpからプラグインへ
ippey
2
490
ざっくり100%GPL
ippey
0
31
Symfony公式の『日本語』入門書ができたよって話
ippey
1
500
『初心者もOK!男木島に思いを馳せながらブロックエディターを使ってページを作ろう!』フォロー
ippey
0
150
初心者でもOK!男木島に思いを馳せながらブロックエディターを使ってページを作ろう!
ippey
0
77
LaravelでのDB操作を監視する
ippey
2
780
Other Decks in Programming
See All in Programming
未経験QAの私が、よきQA(Question Asker) になっていく物語
atamaplus
0
330
Oculus Interaction SDK 概説 / xrdnk-caunity-LT4
xrdnk
0
260
もしも、 上司に鬼退治を命じられたら~プロジェクト計画編~
higuuu
0
290
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
1.2k
TextPruner による大規模言語モデルの軽量化 / Large language model pruning using TextPruner
misawann
0
320
SRE bridge the gap: Feature development to Core API / 機能開発チームとコアAPIチームの架け橋としてのSRE
kenzan100
1
370
Jakarta EE 10 is Coming Your Way
ivargrimstad
0
3k
LOWYAの信頼性向上とNew Relic
kazumax55
4
370
クリエイティブ系のウェブサイト制作で役立つCSS技法 / CSS for develop creative website
clockmaker
2
1.7k
近況PHP / PHP in now a days
uzulla
4
1.9k
プログラミングを勉強したいと言われたら
yuba_4
0
420
SPA/MPA 議論の俯瞰と 現代における設計のポイント - #tfcon 2022 フロントエンド設計
ahomu
3
1.9k
Featured
See All Featured
From Idea to $5000 a Month in 5 Months
shpigford
372
44k
The Language of Interfaces
destraynor
148
20k
Why You Should Never Use an ORM
jnunemaker
PRO
47
5.5k
Git: the NoSQL Database
bkeepers
PRO
415
59k
Atom: Resistance is Futile
akmur
255
20k
The World Runs on Bad Software
bkeepers
PRO
56
5.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
268
11k
The Cult of Friendly URLs
andyhume
68
4.7k
Making the Leap to Tech Lead
cromwellryan
113
6.9k
How STYLIGHT went responsive
nonsquared
85
3.9k
GraphQLとの向き合い方2022年版
quramy
16
8.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
2
470
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Ͱಥ͖௨͢ͷͳ͠Ͱͳ͔ͬͨɻ • ͨͿΜɺͬͱ͖Ε͍ʹͰ͖Δ
ࢼ࣌ͦ͢͜ɺΞʔΩςΫνϟΛҙࣝ͢Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ