PHP Conference Japan 2023でお話ししたスライドです。 #phpcon #phpcon2023
25Ͱཧղ͢ΔʂSymfonyͷັྗͱͦͷ࣮ફత׆༻๏PHP Conference Japan 2023
View Slide
• ֯ాɹҰฏ• גࣜձࣾDROBE• Kansai Symfony Meetup• CoderDojo ຕํࣗݾհ
DROBEͷհ
ελΠϦετ͕ͭ͘ωοτγϣοϐϯά1. Ξϯέʔτʹ͑Δʂ2. ࣗʹελΠϦετ with AI ͕બΜ͕ͩಧ͘ʂ3. ؾʹೖͬͨͷΛߪೖʂଞฦ٫
DROBEͰͷAI׆༻χοτ ʔϧ λʔτϧωοΫϨίϝϯσʔγϣϯ ίʔσΟωʔτఏҊ αΠζϚον λά͚ͳͲͳͲ
DROBEͰͷAI׆༻χοτ ʔϧ λʔτϧωοΫϨίϝϯσʔγϣϯ ίʔσΟωʔτఏҊ αΠζϚον λά͚ͳͲͳͲMade ofɹɹ
AGENDA1. Symfonyͷಛ2. SymfonyͰͷޮతͳ։ൃ3. Symfonyͷ׆༻γʔϯ
λʔήοτͱΰʔϧSymfonyͷՄೳੑͱ׆༻ʹ͍ͭͯΔଞͷϑϨʔϜϫʔΫར༻ऀ
Symfonyͷಛ
Simple
Symfony: 4ͭͷ֓೦1. Components2. Framework3. Community4. Philosophy200Ҏ্ͷίϯϙʔωϯτ܈ίϯϙʔωϯτΛར༻ͨ͠ϑϨʔϜϫʔΫͦΕΒΛࢧ͑ΔίϛϡχςΟSymfonyΛଅਐ͢ΔϚΠϯυ
ϑϨʔϜϫʔΫ”ίϯϙʔωϯτ”ͷ͋ͭ·Γcomposer create-project symfony/skeleton hogesymfony/consolesymfony/dotenvsymfony/framework-bundlesymfony/runtimesymfony/yamlsymfony/cachesymfony/configsymfony/dependency-injectionsymfony/error-handlersymfony/event-dispatchersymfony/http-foundationsymfony/http-kernelsymfony/polyfill-mbstringsymfony/filesystemsymfony/findersymfony/routing
ϑϨʔϜϫʔΫ”ίϯϙʔωϯτ”ͷ͋ͭ·Γίϯιʔϧ.envϑϨʔϜϫʔΫϥϯλΠϜYAMLύʔαΩϟογϡ੍ޚίϯϑΟάDIΤϥʔ੍ޚΠϕϯτHTTP੍ޚHTTPΧʔωϧmbstring֦ுϑΝΠϧ੍ޚσΟϨΫτϦ੍ޚϧʔςΟϯάcomposer create-project symfony/skeleton hoge
ΠϯετʔϧޙʹͰ͖Δ͜ͱ࠷খݶ-BSBWFM $BLF1)1 4ZNGPOZ$PNNBOE ˓ ˓ ˓3PVUJOH ˓ ˓ ˓+40/ ˓ ˓ ˓5FNQMBUF ˓ ˓ º%# ˓ ˓ º7BMJEBUJPO ˓ ˓ º.BJM ˓ ˓ º"VUI ˓ ˓ º&WFOU ˓ ˓ ˓+PC ˓ ˓ º5FTU ˓ ˓ º
ඞཁͳ࣌ʹඞཁͳ͚ͩ
ඞཁͳͱ͖ʹඞཁͳίϯϙʔωϯτΛΠϯετʔϧcomposer require ormDB͕͍͍ͨͳΒೝূ͍ͨ͠ͳΒ composer require securityHTMLςϯϓϨʔτ͍͍ͨ composer require twigςετ͍ͨ͠ composer require test —dev
composer require orm
Symfony Flex: ίϯϙʔωϯτͷΠϯετʔϧϔϧύSymfony͕༻ҙͨ͠ɺίϯϙʔωϯτʹ- ඞཁͳϥΠϒϥϦ- ઃఆϑΝΠϧͷ࡞- ΠϯετʔϧͷޙॲཧΛ·ͱΊͨϨγϐΛݩʹΠϯετʔϧΛߦ͏composerϓϥάΠϯ
ඞཁͳ࣌ʹඞཁͳ͚ͩίʔυ
Autowiring: ґଘΦϒδΣΫτͷࣗಈೖಛఆͷσΟϨΫτϦͷΫϥεΛࣗಈೝࣝ͠- ίϯετϥΫλ- ControllerͷΞΫγϣϯϝιου- SetterͷҾʹࢦఆͨ͠ɺΫϥεɾΠϯλʔϑΣΠεΛܕʹ࣋ͭΦϒδΣΫτΛࣗಈͰೖ͢Δ※ΈࠐΈܕҰ෦ՄೳʹͳΓ·ͨ͠
ΠϯλʔϑΣΠεࣗಈೖ̍InterfaceΛ࣮ͨ͠ΫϥεΛࣗಈೖ
ΠϯλʔϑΣΠεࣗಈೖ̎1ͭΫϥεͰ2ͭͷΠϯλʔϑΣΠεΛ࣮
ΠϯλʔϑΣΠεࣗಈೖ̎ͦΕͧΕʹࣗಈೖ
Symfonyͷಛ1. ඞཁͳ࣌ʹඞཁͳͷ͚ͩΛ͏γϯϓϧͳߏ2. ඞཁͳͷΛ·ͱΊͯΠϯετʔϧɾઃఆͰ͖Δڥ3. ґଘΛΓऔΓɾೖͰ͖Δखܰ͞ඞཁ࠷ݶͳͷΛखܰʹѻ͑Δ
SymfonyͰͷޮతͳ։ൃ
Loose
Symfony CLI: ։ൃʙσϓϩΠ·ͰΛॿ͚ΔCLIGoͷCLIͰ- SymfonyϓϩδΣΫτͷ࡞- ։ൃڥͷඋ- Platform.shͷσϓϩΠػೳΛ࣋ͬͨSymfonyҎ֎Ͱ͑Δπʔϧbrew install symfony-cli/tap/symfony-cli
Α͘͏ίϚϯυsymfony new project-nameϓϩδΣΫτ࡞composer symfony composer ίϚϯυϩʔΧϧαʔόىಈ symfony {server:start -d | server:stop}PHP࣮ߦ symfony php ϓϩάϥϜ໊
PHPͷόʔδϣϯࢦఆ͕Մೳ˞ར༻͍ͨ͠όʔδϣϯͷ1)1ΛΠϯετʔϧ͍ͯ͠Δඞཁ͕͋Γ·͢
࣮ߦதDocker͔ΒڥมΛՃDATABASE_URL=“postgresql://app:sampl[email protected]:85432/app?serverVersion=15&charset=utf8
Attributes: PHPʹຒΊࠐΉઃఆใίʔυએݴ࣌ʹຒΊࠐΉ͜ͱͰΞϓϦέʔγϣϯʹઃఆใΛ࣋ͨͤΔ͜ͱ͕Ͱ͖ΔɺPHPͷػೳϑϨʔϜϫʔΫͰར༻͍ͯ͠ΔͷSymfony, Spiral Framework
ϧʔςΟϯάϦΫΤετͷϚοϐϯά
όϦσʔγϣϯσʔλϚοϐϯά
࣮ίʔυ֎
Doctrine: DBΛѻ͏ORMDBΛѻ͏ORMͰ- POPOͳEntity- ࢀরΛओͱͨ͠Repository- DBͷಉظΛ୲͏EntityManagerΛͭɺDataMapperܕͷORMsymfony composer require orm
DataMapperͱActiveRecordͷҧ͍id=1id=4id=1id=4id=4id=1id=1id=1id=4ࢀরίϐʔૢ࡞ૢ࡞ϏδωεϩδοΫ->save()->flush()ԆϑΣονEntity Managerಉظ->save()->save()ίϯτϩʔϥʔΫΤϦ͝ͱʹҟͳΔΠϯελϯεੜɻΠϯελϯεʹҰҙੑ͕ͳ͍ɻ != EntityDB ࣮ମ͕ͳ͍ͱ߹ੑ͕Γཱͨͳ͍ɻϏδωεϩδοΫ͕ʮDBอଘʯΛ࣋ͭɻͯ͢ͷ Entity ԾతʹΦϯϝϞϦͰΓͳ͍ͷ͚ͩΛԆϑΣονɻRepository ࢀরΛఏڙ͢Δ͚ͩɻϏδωεϩδοΫOOP͚ͩͰ݁͢ΔɻࠩSQLੜ
ར༻RepositoryϑΟʔϧυఆٛGetter/SetterAttributesΛղऍͯ͠ϚΠάϨʔγϣϯʢdiffʣ࡞
ϑΟʔϧυఆٛΛͱʹͨ͠ϚΠάϨʔγϣϯ
EntityManagerΛDIEntityManagerొɾಉظ
EntityManager͕DI͞ΕͯΔՕॴ=DBಉظ͋Γ
࡞DBಉظࡏݿ࡞ มߋཤྺ࡞ϦΫΤετडऔ$POUSPMMFS 6TF$BTF &WFOU-JTUFOFS
࡞DBಉظࡏݿ࡞ มߋཤྺ࡞ϦΫΤετडऔ$POUSPMMFS 6TF$BTF &WFOU-JTUFOFSDBอଘͷ͜ͱΛߟ͑ͳͯ͘Α͍ྖҬ
ΦϒδΣΫτΛฦ͚ͩ͢ͷγϯϓϧͳΫϥεʹ
Test: ֤छςετΛαϙʔτSymfonyͰ- Unit Test- Integration Test- Application TestΛߦ͏ڥΛ༻ҙɻ·ͨɺSymfony PantherͰE2Eςετ࣮ࢪՄೳɻ
DI෦ΛϞοΫ
zenstruck/foundry: ඞཁͳྔͷσʔλΛొςετΛߦ͏ࡍʹ- ඞཁͳྔͷσʔλͷొ- ϚΠάϨʔγϣϯʹґଘ͠ͳ͍ςʔϒϧ࡞- ͍ํLaravelͷFactoryνοΫΛ࣮ݱ͢ΔɺσʔλొϥΠϒϥϦsymfony composer require zenstruck/foundry
Ͱ͖Δςʔϒϧ’item’͚ͩ
Symfonyͷޮతͳ։ൃ1. ϩʔΧϧ + DockerͰͷ։ൃΛڧྗʹαϙʔτ2. AttributesΛར༻ͨ͠ɺඞཁͳϩδοΫͷΈͷ։ൃ͕Մೳ3. DIΛ༗ޮʹར༻ͨ͠ɺඞཁͳՕॴɾσʔλͷΈͷςετແҙࣝʹૄ݁߹ʹۙͮ͘։ൃମݧ
Symfonyͷ׆༻γʔϯ
Flexible
ϓϩτλΠϓɾMVPCLI, API, HTMLͳͲ৭ʑͳܗʹ༰қʹมߋͰ͖ΔͨΊɺεςʔΫϗϧμʔͱ͘͢ҙࢥૄ௨͕Մೳɻ·ͨɺॳظஈ֊͔Βૄ݁߹Λอ͍ͪ͢ɻ
CRUDRouter, Voter, ValueResolverͳͲͷAttributesΛۦ͢Δ͜ͱͰ༰қʹCRUD͕࡞Ͱ͖Δ
ValueResolverControllerͷΞΫγϣϯϝιουͰҾʹResolverΛࢦఆ͢Δ͜ͱͰɺඞཁͳσʔλͷϩδοΫΛController͔ΒഉআͰ͖Δ
ཧը໘Role, VoterͳͲͷೝূػೳΛͬͨϑϨΩγϒϧͳΞΫηε੍ޚ͕ՄೳɻՃ͑ͯɺWorkflowʹΑΔεςʔλεཧͷಋೖ͕͍͢͠ɻ·ͨɺ؆୯ͳཧը໘Ͱ͋ΕEasyAdmin Bundle͓͢͢Ί
WorkflowΦϒδΣΫτʹεςʔλεΛ༩͑ɺεςʔλεͷΓସ͑ɺঢ়ଶͷνΣοΫΛߦ͏ɻsymfony composer require workflow
εςʔλεछྨτϥϯδογϣϯʢભҠʣ
τϥϯδογϣϯʢ֬ೝˍભҠʣWorkflowΛDI
APIڧྗͳSerializerΛར༻͠ɺ༰қʹAPIͷ։ൃ͕Մೳɻ·ͨɺ؆୯ͳͷͰ͋ΕAPI PlatformΛ͑AttributesΛ͚ͩ͢ͰAPIͷ࡞͕Մೳ
SerializerΦϒδΣΫτྻɺJSONͳͲΛͦΕͧΕͷϑΥʔϚοτʹม͢Δsymfony composer require serializer
ࢦఆͨ͠άϧʔϓͷΈදࣔඇදࣔ
/api/itemsͷCRUDͳAPI͕ࣗಈੜ
ϞδϡϥϞϊϦεσΟϨΫτϦߏʹେ͖ͳറΓͳ͍ͷͰɺυϝΠϯຖʹΓग़ͯ͠ϞδϡϥϞϊϦεՄೳɻଞͷखஈ͋Γɻৄ͘͠…
14:50ʙ τϥοΫ1
Symfonyͷ׆༻γʔϯ1. ϓϩτλΠϓ͔ΒΤϯλʔϓϥΠζ·Ͱͦͭͳ͘͜ͳ͢2. ෳࡶͳॲཧΛ͍ग़͢͜ͱͰಘΔɺߴ͍ϝϯςφϏϦςΟ3. (࣌ؒͷ߹Ͱઆ໌Ͱ͖ͳ͍) ࠷৽όʔδϣϯैͷ͢͠͞ॊೈͰڧਟͳαʔϏεͷߏங͕Մೳ
We are hiring!!ΧδϡΞϧ໘ஊਵ࣌डதͰ͢ʂDROBE͍͍ͧࠓͳΒ৭ʑͳτϥΠΛମݧͰ͖·͢