2021/10/02, 03に開催されてPHP Conference Japan 2021の登壇でお話ししたスライドです。
#phpcon2021 #phpcon #php
PHP Conference Japan 2021 Day2SymfonyͱDoctrineͰ ؆୯ΫϦʔϯΞʔΩςΫνϟʙϓϩτλΠϐϯάʹͦ͜ΫϦʔϯͳTDD͕׆͖ͨʙ
View Slide
֯ాɹҰฏ• ౡݝग़ɺେࡕࡏॅ• ϑϦʔϥϯε Webσϕϩούʔ• Symfony Meetup KansaiӡӦ ίϛϡχςΟ׆ಈͬͯ·͢WordCamp Osaka 2019ippei Wapuu sukisuki
ͨͳ͔ɹͻͯ͞Δ• ಉ͘͡େࡕͷ PHPer Ͱ͢• ͜ͱݚڀॴɾॴ• ͳ͔ͥωοτͱٕज़ࢽͰϚϯΨΛඳ͍͍ͯ·͢SoftwareDesignPHP ΧϯϑΝϨϯε௨৴
• Symfony+DoctrineͰΫϦʔϯΞʔΩςΫνϟͳ࣮Ҋ݅ΛͬͨΑ• Symfony, Doctrine, ΫϦʔϯΞʔΩςΫνϟ֓ཁ• ͳʹΛͲͷΑ͏ʹ࡞͍͔ͬͯͬͨ• Symfony, Doctrine, ΫϦʔϯΞʔΩςΫνϟ·ͰͷOOP• ৄࡉͳίʔυͷઆ໌↑͓͠͠·͢↓ׂѪ͠·͢ࠓ͓ͳ͢͠Δ༰
͜ͱͷ͡·Γ
͋͟·͢ʔʂΓ·͢ʔʂϓϩτλΠϓͭ͘Δ͓ࣄ͋ΔΜͰ͕͢ɺͲ͏Ͱ͔͢ʁ͍ͬ͠ΐʹͲ͏Ͱ͔͢ʁ
ࠓճͷҊ݅֓ཁʢԾʣϦΞϧλΠϜಈը৴αʔϏεͷϓϥοτϑΥʔϜར༻اۀAར༻اۀBAͷϢʔβʔBͷϢʔβʔϚελʔίϯςϯπ൪දA൪දBೝূɾ৴: ͏ͦͰ
͍͟ϓϩτλΠϐϯάͦͷલʹ
։ൃํͷ૬ஊɺࡦఆ#1
Ͱ͢ͶʔɻͱΓ͍͋͑ͣͬͨΜू·Γ·͔͢ʁ
·ͣཁٻ֬ೝ• ͍͍ͨͩͨཁٻΛ֬ೝ• ͦΕΛͲͷΑ͏ͳٕज़ɺํ๏Ͱ࡞͍͔ͬͯ͘૬ஊ
֎෦αʔϏεͱ͔ɺԿ͏͔Θ͔Βͳ͍Ͱ͢͠Ͷʔ͍ͬ͡͞ޙͰͲ͏มߋ͞ΕΔ͔Θ͔Μͳ͍ͷͰɺͳΔ͘ૉͷPHPͰ͔ͨΊ·͠ΐ͏͔ɻͰ͋Εɺ͜ͷΞʔΩςΫνϟ͍ͬͯΈ·͔͢
ΫϦʔϯΞʔΩςΫνϟઃܭํΛ࠾༻
؆୯ͳΫϦʔϯΞʔΩςΫνϟͷઆ໌• ґଘํΛ෦ʹ͔͏Α͏ʹ͚ͯͶ• ҎԼͷ༷ʹ࣮Λ৺͕͚ΔͱΑ͍Α• EntitiesʢԫʣʹυϝΠϯϞσϧΛ• Use Casesʢʣʹۀͷػೳཁ݅Λ• ControllersʢʣʹӬଓԽͱೖग़ྗΛ• Devices / DB / UIʢ੨ʣʹٕज़తͳԼࢧ͑ϑϩϯτΤϯυΛ• ্هͷ࡞ΓํΛνʔϜͰҙࣝͯ͠࡞ΔͱΈΜͳ͕ͤͩΑ• มʹݻࣥ͠ͳ͍Α͏ʹ͖Λ͚ͭͯͶ
֎ଆٕज़Λϓϩάϥϛϯά͢Δͱ͜Ζը໘ετϨʔδͳͲଆۀΛϓϩάϥϛϯά͢Δͱ͜ΖݴޠʹΑΔ७ਮͳϩδοΫ͖Ε͍ʹอ͍ͪͨґଘํDIPΛ׆͔ͯ͠ଆ͔Β֎ଆґଘ͠ͳ͍Α͏ʹuseimplement🙅
ͳ͖ͥΕ͍ʹอ͍ͪͨʁ• ۀʹΑٕͬͯज़͕มΘΔͷΑ͋͘Δ͜ͱ• ۀϩδοΫ͕ٕज़ʹґଘ͍ͯ͠Δͱɺٕज़ͷӨڹͰۀϩδοΫ͕มΘΔ͜ͱʹͳΔۀϩδοΫ͕ෳࡶʹͳΔݪҼΛݮΒ͍ͨ͠
֎ଆ ଆϩάΛMySQLʹอଘྫɿμʔςΟʔͳϩάอଘϩάMySQLʹอଘMySQL❓
֎ଆ ଆϩάΛDynamoDBʹอଘྫɿμʔςΟʔͳϩάอଘDynamoDBʹม͑·͢ۀϩδοΫΛ मਖ਼͠ͳ͍ͱ͍͚ͳ͍DynamoDBMySQL❗❓
֎ଆϩάΛ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=1id=4id=1id=4id=4id=1id=1id=1id=4ࢀরίϐʔૢ࡞ૢ࡞ϏδωεϩδοΫ->save()->flush()ԆϑΣονEntity Managerಉظ->save()->save()ίϯτϩʔϥʔΫΤϦ͝ͱʹҟͳΔΠϯελϯεੜɻΠϯελϯεʹҰҙੑ͕ͳ͍ɻ != EntityDB ࣮ମ͕ͳ͍ͱ߹ੑ͕Γཱͨͳ͍ɻϏδωεϩδοΫ͕ʮ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:diff ΤϯςΟςΟΫϥεͱDBͷࠩҟΛௐɺϚΠάϨʔγϣϯϑΝΠϧΛ࡞
1. ΤϯςΟςΟ࡞উखʹೖΕͯ͘ΕΔ͋ͬͯͳͯ͘ςετͷಈ࡞ʹؔͳ͍͔Βͦͷ··͍࣍͜͏
2. ςετ࡞ (PHPUnit)ࢦఆͨ͠༰ͰΤϯςΟςΟ͕ ࡞ΒΕΕ0,
3. Ϣʔεέʔε࡞
3-a. ςετௐύεϫʔυϋογϡԽΛϞοΫࢦఆͨ͠༰ͰΤϯςΟςΟ͕ ࡞ΒΕΕ0,
4. WebαʔϏεʹΈࠐΈϧʔςΟϯά࡞ͬͨϢʔεέʔε
5. ϑϩϯτ࡞ (TypeScript+JSX)
Ͱ͢ͶʔɻͳΜ͔͍͚ͦ͏Ͱ͢Ͷɻ
͜͜·Ͱ·ͱΊ• ࣮ࡍʹબఆͨ͠ͷ͕ػೳ͢Δ͔খ͘͞࡞ͬͯࢼ͢ͱ٢• ΫϦʔϯΞʔΩςΫνϟΛҙࣝͯ͋͠ΔఔΫϥε࡞• ͜͜ͰTDDɻ• Ϣʔεέʔεʹରͯ͠ςετΛهड़• DBʹอଘ͠ͳ͍ͷͰɺEntity͕Ͱ͖ΕOK• ϖΞϓϩʹCode with Me͕ศརͰͨ͠
Ϩοπϓϩτʂ#3
ϓϩτͰ࡞ΔετʔϦʔΛચ͍ग़͠·͠ΐ͏͔
ϢʔβʔετʔϦʔϚοϐϯά
ϢʔβʔετʔϦʔϚοϐϯάͱ• ϢʔβʔͷετʔϦʔΛ࣌ܥྻͰચ͍ग़͠ɺ༏ઌΛ͚͍ͭͯ͘• ϓϩδΣΫτࢀըऀશһͰ࣮ࢪ• ࣌ܥྻɾ༏ઌͰཧ͢Δ͜ͱͰɺҎԼΛѲ͢Δ• ։ൃॱংʢ·ͣͲ͜ʹྗ͢Δඞཁ͕͋Δ͔ʣ• ൈ͚࿙Ε͕ͳ͍͔• ϓϩδΣΫτʹࠐΊͨࢥ͍ʢΊ͋ͯʣ
༏ઌ༏ઌߴϢʔβ࣌ܥྻاۀొ ϓϥϯ࡞ ϓϥϯҰཡ اۀฤू …اۀใΛొදऀΛొࢧ͍ํ๏Λ ొࣄલϓϥϯ͔Β ࡞ProgramΛ ՃΧελϚΠζ ͯ͠࡞ϓϥϯҰཡΛ ӾཡϓϥϯͷৄࡉΛ ӾཡاۀใΛฤूࢧ͍ํ๏Λ ฤू…Twitterͱ࿈ܞઈରඞཁૣΊʹཉ͍͠ٸ͗Ͱͳ͍ϓϩτ։ൃରϢʔβΛొදऀΛฤू˞ಛʹॏཁͳՕॴͷΈ
Γΐ͏͔͍Ͱ͢ʔͰ؆୯ͳϞσϦϯά͍͖ͯ͠·͠ΐ͏͔·ͣEntityͷચ͍ग़͔͠Βʙ
ॳظͷཁٻ༷ʢԾʣ• ܖ๏ਓࣗͷ৴αΠτͰ৴͠์• ऩࡁΈͷίϯςϯπ୯ҐΛʰϓϩάϥϜʱͱݺͿ• ϓϩάϥϜΛ৴νϟϯωϧͷʰϓϥϯʱʹฒΔ• ৴ऀϓϥϯΛΧελϚΠζͰ͖Δ• ৴αΠτϓϥϯΛෳνϟϯωϧઃ͚Δ͜ͱͰ͖Δ• ӡӦ͔Βࣄલఆٛ͞Εͨϓϥϯ͕ఏڙ͞ΕΔ• ࢹௌऀΞΫλʔϓϩάϥϜ୯ମͷΞʔΧΠϒΛ؍Δ͜ͱ͕Ͱ͖Δ: ͏ͦͰ
͋ʔͦ͏͔ͦ͏͔ɻ͡Όɺ͜ΕεΫϦʔϯͬͯײ͡Ͱ͔͢ͶʁͳΜ͔ཁͷ༻ޠ͕͔ͭΈͲ͜Ζͳ͍ͳ͋ɻ ͜Ε࣮͕ͬͯ͋ͬͨ͠ΒөըؗΈ͍ͨͳͷͰʙϐϯͱ͖·ͨ͠Ͷʙɻ͜͜Ͱ͢Ͷ…ΈΜͳ༻ޠΛऔΓҧ͑Δ
࣮ମΛΠϝʔδͰ͖Δͷʹஔ͖͑Δ※ Մࢉ໊ࢺʹ͢ΔͱΦϒδΣΫτʹ͍͢͠
͜͜؆୯ʹݴ͑͜͏͍͏͜ͱͰ͢ΑͶʔ͜Εͬͯɺཁ͜͏͍͏͜ͱͰ͢ΑͶʔʢ࡞ͨ͠ਤΛݟͳ͕ΒʣͰ͢ͶʔϞσϦϯάͨ݁͠ՌΛશһʹڞ༗୭ޡղ͠ͳ͘ͳͬͨ💯
Γΐ͏͔͍Ͱ͢ʔͭ͗ϢʔεέʔεͷϞσϦϯά͠·͠ΐ͏͔ʔͰϢʔβʔετʔϦʔϚοϐϯάͷʙ͔ΒखΛ͚ͭ·͠ΐ͏
͍͞͠ΐʹͲ͏ͬͯ࡞Δ͔͠߹ͬͨͷ͕ޮ͍ͯ·͢Ͷ͍͞͠ΐʹ૬ஊͯ͠࡞ͬͨϨΠϠʔʹ͋Θ͍ͤͯ͘ͱ͜Μͳײ͡Ͱ͔͢ͶͰɺίʔυʹམͱͯ͠Έ·͔͢…
өըؗͰձһొ͢Δײ͡Ͱ͢ΑͶʔϢʔβՃ͢Δͱɺ͜͏ͳΔͬͯ͜ͱͰ͢ΑͶʢ࣮ߦ݁ՌΛݟͳ͕ΒʣͰ͢Ͷʔίʔυʹམͱͨ݁͠ՌΛશһʹڞ༗
Ͱ͢Ͷʔ͡ΌɺϝʔϧΛૹͬͯɺϢʔβ͕ඞཁͳใೖྗͨ͠ΒొͰ͢Ͷʔ࣮ࡍϢʔβʹԾొϝʔϧૹΔ͔Μ͡Ͱ͔͢Ͷʔೝࣝ߹Θͤͳ͕ΒϒϥογϡΞοϓ͢ΔՕॴΛ֬ೝ
ͳͷͰɺϢʔβͷσʔλ͜Μͳײ͡Ͱ͓࣋ͬͯ͘ͷͲ͏Ͱ͔͢ʁ͋ͬɺ͔ͨ͠͠Β͜Μͳӡ༻χʔζ ͋Μͳӡ༻χʔζ͕ग़ͯ͘Δ͔ɻೝূΞΫλʔ͝ͱʹ͚ͣɺ ΈΜͳڞ௨͕߹ྑ͍ͱࢥ͏ΜͰ͕͢Ͳ͏Ͱ͔͢ʁͳΔ΄Ͳʔ࡞࣌ͷؾ͖ͮΛϑΟʔυόοΫ
ίʔυͷՃɾมߋɾഁغ͕ଟൃ࡞࣌ͷؾ͖ͮΛϑΟʔυόοΫʹ
͜͜Ͱ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Ͱಥ͖௨͢ͷͳ͠Ͱͳ͔ͬͨɻ• ͨͿΜɺͬͱ͖Ε͍ʹͰ͖Δ
ࢼ࣌ͦ͢͜ɺΞʔΩςΫνϟΛҙࣝ͢Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ