Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
実践DIコンテナ
Sota Sugiura
April 20, 2016
Technology
0
3.4k
実践DIコンテナ
DIコンテナを使って役に立った場面をご紹介
PHP BLT#4 (
http://phpblt.connpass.com/event/27655/
) 発表資料
Sota Sugiura
April 20, 2016
Tweet
Share
More Decks by Sota Sugiura
See All by Sota Sugiura
sota1235
10
2.9k
sota1235
9
180
sota1235
7
3.1k
sota1235
4
1.2k
sota1235
6
8.9k
sota1235
1
740
sota1235
3
3.4k
sota1235
0
270
sota1235
13
6.3k
Other Decks in Technology
See All in Technology
shimacos
2
360
stakaya
14
8.2k
ishiayaya
PRO
0
350
ryusa
2
320
yosshi_
3
350
recruitengineers
0
120
sumi
0
570
yamasaki696
0
340
nihonbuson
2
1.9k
ocise
0
170
torisoup
0
310
yasuakiomokawa
0
380
Featured
See All Featured
kastner
54
1.9k
matthewcrist
73
7.5k
pauljervisheath
196
15k
tenderlove
52
3.4k
samanthasiow
56
6.3k
chrislema
231
16k
bkeepers
408
57k
zenorocha
297
40k
michaelherold
225
8.5k
nonsquared
81
3.3k
carmenhchung
26
1.3k
dotmariusz
94
5.1k
Transcript
࣮ફ%*ίϯςφ PO-BSBWFM !TPUB 1)1#-5
ࣗݾհ w ਿӜᰜଠ 4PUB4VHJVSB w !TPUB w ͪͺʔྺ w
גࣜձࣾΞΠελΠϧ ʘ'PMMPXNFʗ
ΈΜͳʮ%*ศརͩͧʂʯ
ʮͲ͏͍͏෩ʹʜʁʯ
ͯ͜ͱͰ
%*ίϯςφͷΛ͠·͢ ͬͯΔͧͬͯํπΠολʔͯ͠Ͳ͏ͧ Ňŏ﹏ŏ
%*ͱ w %*%FQFOEFODZ*OKFDUJPO w ʮґଘੑͷೖʯͱݴ͏ͱ͔ݴΘͳ͍ͱ͔ w ৄ͍͠આ໌࣌ؒͷ߹্Χοτ ứʆ
%*ίϯςφͱ w %*ύλʔϯͰґଘղܾ͞ΕͨΠϯελϯεΛฦ ͯ͘͠ΕΔγϩϞϊ w ༷ʑͳ࣮͕͋Δ͕ɺ͜͜Ͱ-BSBWFMΛྫʹ
-BSBWFMʹ͓͚Δ %*ίϯςφ
%*$POUBJOFSPO-BSBWFM w ίϯετϥΫλͰλΠϓώϯτ͓͍ͯͨ͠Ϋϥε Λ%*ίϯςφ͕ೖͯ͘͠ΕΔ w ඞཁͳΫϥεʹ͞ΒʹඞཁͳΠϯελϯε͕͋ Ε࠶ؼతʹΠϯελϯεΛೖ͢Δ
%*$POUBJOFSPO-BSBWFM #SFBE
%*$POUBJOFSPO-BSBWFM #SFBE *OFFE #BDPO -FUUVDFBOE5PNBUP public function __construct( Bacon $bacon,
Lettuce $lettuce, Tomato $tomato ) { // }
%*$POUBJOFSPO-BSBWFM %*$POUBJOFS (JWFZPV #SFBE *OFFE #BDPO -FUUVDFBOE5PNBUP #BDPO -FUUVDF 5PNBUP
%*$POUBJOFSPO-BSBWFM %*$POUBJOFS *OFFE4BMU #SFBE #BDPO -FUUVDF 5PNBUP public function __construct(Salt
$salt) { // }
%*$POUBJOFSPO-BSBWFM %*$POUBJOFS (JWFZPV *OFFE4BMU #SFBE #BDPO -FUUVDF 5PNBUP 4BMU
%*$POUBJOFSPO-BSBWFM %*$POUBJOFS /FFE /FFE /FFE #SFBE #BDPO -FUUVDF 5PNBUP 4BMU
/FFE
$MBTT#JOEJOH w %*ίϯςφʹ͋Β͔͡ΊΠϯελϯεΛಥͬࠐ ΊΔ
$MBTT#JOEJOH <?php /* ུ */ /** * */ public function
boot() { $this->app->bind( // ίϯετϥΫλͰλΠϓώϯτ͞ΕΔΫϥε໊ \App\Dinners\PotatoTips::class, function ($app) { // ࣮ࡍʹฦ͞ΕΔΠϯελϯε return new \App\Dinners\Blt; } ); }
$MBTT#JOEJOHT "QQMJDBUJPO *OFFE 1PUBUP5JQT %*$POUBJOFS
$MBTT#JOEJOHT "QQMJDBUJPO *OFFE 1PUBUP5JQT %*$POUBJOFS $this->app->bind( \App\Dinners\PotatoTips::class, function ($app) {
return new \App\Dinners\Blt; } );
$MBTT#JOEJOHT "QQMJDBUJPO *OFFE 1PUBUP5JQT %*$POUBJOFS (JWFZPV #MU
$MBTT#JOEJOHT "QQMJDBUJPO *OFFE 1PUBUP5JQT %*$POUBJOFS (JWFZPV #MU ˞௨ৗͷλΠϓώϯτͱಉ༷ɺ ܧঝؔʹͳ͍ͱΤϥʔʹͳΓ·͢
͜͜·Ͱલ࠲
ຊ ͜ͷ%*ίϯςφ͕ʹཱͬͨ໘Λ͝հʂʂʂ
ͦͷ ࣮ͷࠩ͠ସ͑
Ғ͍ਓʮநʹґଘͤΑʯ w Α͋͘Δ%*ίϯςφͷ͍ํͱͯ͠நΫϥε ʹ۩ΫϥεΛ$MBTT#JOEJOH͢Δ
*OUFSGBDFBOE$MBTT interface Burger { public function addTopping($toppingName); } class Blt
implements Burger { public function addTopping($toppingName) { // } }
#JOE*OUFSGBDF /* in DI Container */ public function boot() {
// ΠϯλʔϑΣʔεʹ۩ΫϥεΛbind // BurgerΠϯλʔϑΣʔεΛλΠϓώϯτ͢Δͱ // BltΫϥε͕ೖ͞ΕΔ $this->app->bind(Burger::class, Blt::class); }
ಥવͷϦΫΤετ ʮԶ#-5͡Όͳͯ͘ςϦϠΩόʔΨʔ͕৯͍ͨʯ
ʮطଘίʔυΛॻ͖͑ͣʹ ཁʹ͍͑ͨʯ
ͦ͏ͩʂநͩʂ w ͜ͷ࣌ɺٻΊΒΕͯΔͷ#VSHFSΠϯλʔ ϑΣʔεΛ࣮ͨ͠৽ͨͳόʔΨʔ w ͭ·Γ෦తͳ࣮͕Ͳ͏มΘΖ͏ͱͦͷந Λ࣮͢Εࠩ͠ସ͕͑Մೳ
/FX$MBTT interface Burger { public function addTopping($toppingName); } class Blt
implements Burger { public function addTopping($toppingName) { // } } class Teriyaki implements Burger { public function addTopping($toppingName) { // } }
$IBOHF$MBTT#JOEJOH /* in DI Container */ public function boot() {
// ݩʑͷΫϥε // $this->app->bind(Burger::class, Blt::class); // ৽ࠩ͘͠͠ସ͑ΔΫϥεΛBinding $this->app->bind(Burger::class, Teriyaki::class); }
.JTTJPO$PNQMFUF 㱼ʆ w நͱ%*ίϯςφΛ͏·͘ѻͬͯطଘίʔυʹ खΛೖΕͣʹ৽͍͠ίʔυʹࠩ͠ସ͑Δ͜ͱ͕ Մೳ w %*ίϯςφ͚ͩͷͰͳ͍ΜͰ͕͢ศརͩΑ ͱ͍͏ʜͶʜ
ͦͷ ςετ࣮
ྫ͑͜ΜͳςετΛॻ͖͍ͨ
501ϖʔδʹΞΫηεͨ͠Β ͪΌΜͱϖʔδ͕දࣔ͞ΕΔ͔
"QQMJDBUJPO5FTUJOH w %#ʹ͍߹Θͤͯฦ͖ͬͯͨͷ͕501ϖʔδ ʹग़Δͣʜ w ͖ͪΜͱɺ͔ͭ%#͔ΒͷϨεϙϯε͕ࡌͬ ͯΕ0,
"QQMJDBUJPO5FTUJOH /** * TOPϖʔδʹΞΫηεͨ͠Β’username'ͷจࣈྻ͕͋Γɺ * HTTPεςʔλείʔυ͕200Ͱ͋Δ͜ͱ */ public function testAccessTopPage()
{ $this->visit('/top') ->see(‘username') ->assertResponseOk(); }
Έ w ςετέʔε࣮ߦ͞ΕΔʹ%#ΞΫηε͢Δͷ πϥΠ w ޭ༻ࣦഊ༻ͷσʔλΛέʔε͝ͱʹ༻ҙ͢Δ ͷπϥΠ w ςετલޙͰ%#ͷ͓আͱ͔πϥΠ
6TF%*$POUBJOFS ͦΕɺ%*ίϯςφͰղܾͰ͖·͢Α
$MBTT#JOEJOH w σʔλʹΞΫηεͯ͠ΔΫϥε%*ίϯςφ͔ Βೖ͞Ε͍ͯΔ w ςετத͚ͩσʔλΞΫηεΫϥεʹߜͬͯϞο ΫΫϥεʹ#JOEJOHͯ͠͠·͓̺͑
.BLJOH.PDL$MBTT // σʔλΞΫηεΫϥεͷϞοΫ࡞ $userMock = \Mockery::mock(\User::class); $userMock->shouldReceive(‘getUsers')->andReturn('username');
#JOEJOH.PDL$MBTT // ϞοΫΫϥεΛBinding $this->app->bind(\User::class, function () use ($userMock) { return
$userMock; });
5FTUJOH public function testAccessTopPage() { // σʔλΞΫηεΫϥεͷϞοΫ࡞ $userMock = \Mockery::mock(\User::class);
$userMock->shouldReceive('getUsers')->andReturn('username'); // ϞοΫΫϥεΛBinding $this->app->bind(\User::class, function () use ($userMock) { return $userMock; }); // ςετ࣮ߦ $this->visit('/top') ->see('username') ->assertResponseOk(); }
.JTTJPO$PNQMFUF 㶅㱿㶅 w ष͍ͷʹ֖ςετͷతΛՌͨͨ͢ΊʹΞϓ ϦέʔγϣϯͷҰ෦͚ͩϞοΫͰࠩ͠ସ͑Δ ͜ͱ͕Ͱ͖ͨʂ w ΞΫηεςετͰͳ͍ͯ͘Ζ͍Ζͳͱ͜ΖͰ Ԡ༻Մೳ w
"1*ΞΫηεͷϞοΫͱ͔
·ͱΊ w %*ίϯςφΫϥεͷґଘ͕ղܾ͞ΕͨΠϯε λϯεΛฦͯ͘͠ΕΔຐ๏ͷശ w ͏·͘པΕςετ࣮ͷࠩ͠ସ͕͑ͱͯ ؆୯@ ᵇʮЏ @ w
ΠέͯΔ%*ίϯςφϥΠϒϥϦҰഋ͋ΔͷͰ ֤ࣗ(PPHMFઌੜʂ
Ҏ্ʂ