Slide 1

Slide 1 text

ϑϨʔϜϫʔΫ 143ͱ %*ͱ

Slide 2

Slide 2 text

1)1JT

Slide 3

Slide 3 text

8FCϑϨʔϜϫʔΫ ଟ͗͢ݴޠ

Slide 4

Slide 4 text

'"2 ʮͲΕ͕ྑ͍Ͱ͔͢ ʯ

Slide 5

Slide 5 text

ओͳϑϧελοΫ'8 ػೳൺֱ

Slide 6

Slide 6 text

4ZNGPOZ $BLF1)1 -BSBWFM :JJ $PEF*HOJUFS 3PVUJOH P P P P P %BUBCBTF P P P P P 03. P P P P $BDIF P P P P P 7JFXIFMQFST P P P P P 'PSNWBMJEBUJPO P P P P P -PHHJOH P P P P P $43'QSPUFDUJPO P P P P P 5FTUTVQQPSU P P P P P %FCVH6* P P P P *:3rd party

Slide 7

Slide 7 text

͍͍͓ͩͨΜͳ͡΍Μ ·͢·͢Θ͔ΒΜ

Slide 8

Slide 8 text

ྺ࢙

Slide 9

Slide 9 text

1)1 1)1 1)1 ;FOE'SBNFXPSL 4ZNGPOZ $BLF1)1 $PEF*HOJUFS -BSBWFM 4QSJOH 3VCZPO3BJMT ʙ :JJ

Slide 10

Slide 10 text

4QSJOH΍3BJMT͔Β ΍΍஗Εͨఔ౓ +BWB3VCZͷӨڹΛड͚ͯͷ஀ੜͳͷͰ

Slide 11

Slide 11 text

͜Ε͚ͩͷ௕ظؒ ࢥ૝͕౫ଡ͞Εͣ ࢖͍ଓ͚ΒΕ͍ͯΔ ͱ͍͏͜ͱ͸

Slide 12

Slide 12 text

1)1ͷ'8ɺຊ࣭తʹ ͦΕͧΕҧ͏໾໨Λ ࣋ͭͷͰ͸

Slide 13

Slide 13 text

8FCϑϨʔϜϫʔΫ ଟ͗͢ݴޠJO ͳͷͰจԽత ֶͼͷଟ͍

Slide 14

Slide 14 text

͍·ɺҎདྷͷ 1)1ϑϨʔϜϫʔΫ ܹಈͷ࣌୅͔ 143ొ৔

Slide 15

Slide 15 text

ύωϥʔ঺հ

Slide 16

Slide 16 text

143

Slide 17

Slide 17 text

1)1 4UBOEBSET 3FDPNNFOEBUJPO 1)1ඪ४ͷਪ঑ࣄ߲

Slide 18

Slide 18 text

1)1'SBNFXPSL *OUFSPQFSBCJMJUZ(SPVQ 1)1ϑϨʔϜϫʔΫ૬ޓӡ༻άϧʔϓ 1)1'*( ֤ϑϨʔϜϫʔΫؒͰڞ௨ͷ͖·ΓΛઃ͚Α͏ ಛఆϑϨʔϜϫʔΫઐ༻ͷϥΠϒϥϦ͸࢖͍ʹ͍͘ ࢖༻தͷϑϨʔϜϫʔΫ͕ϥΠϒϥϦͷઃܭͱ߹Θͳ͍ ͦ͏͍͏ͷ΍ΊΑ͏

Slide 19

Slide 19 text

ίʔσΟϯάن໿143 w 143143Ϋϥεͷ໋໊ͱ഑ஔ w 143143143 ESBGU ίʔσΟϯάελΠϧ w 143 ESBGU EPDίϝϯτ

Slide 20

Slide 20 text

ΠϯλʔϑΣʔε143 w 143ϩΨʔΠϯλʔϑΣʔε w 143143ΩϟογϯάΠϯλʔϑΣʔε w 143)551ϝοηʔδΠϯλʔϑΣʔε w 143ϋΠύʔϦϯΫΠϯλʔϑΣʔε w ͦͷଞESBGUෳ਺

Slide 21

Slide 21 text

Slide 22

Slide 22 text

/PX*O3FWJFX

Slide 23

Slide 23 text

143 $POUBJOFS*OUFSGBDF ίϯςφɾΠϯλʔϑΣʔε

Slide 24

Slide 24 text

%# -PH 4FDVSJUZ αʔϏε ϑϨʔϜϫʔΫͷΠϝʔδ ࣮૷

Slide 25

Slide 25 text

$logger = new SuperFlexibleLogger(); $logTarget = new FileLogTarget('/var/log/myapp.log'); $logTarget->setLevel(INFO | WARNING | ERROR); $logger->addTarget($logTarget); $logger->error('...'); ͱ͋ΔϩΪϯάϥΠϒϥϦΛ࢖͍͍ͨͱࢥͬͨ৔߹

Slide 26

Slide 26 text

$logger = new SuperFlexibleLogger(); $logTarget = new FileLogTarget('/var/log/myapp.log'); $logTarget->setLevel(INFO | WARNING | ERROR); $logger->addTarget($logTarget); $logger->error('...'); ͱ͋ΔϩΪϯάϥΠϒϥϦΛ࢖͍͍ͨͱࢥͬͨ৔߹ ຖճίϐϖ΍Ίͯ

Slide 27

Slide 27 text

$logger = $container->get('logger'); $logger->error('...'); ઃఆࡁΈͷϩΨʔΛԿ͔ʹอ࣋ͤ͞ αʔϏεͱͯ͠࠶ར༻ Log::error('...'); ͨͿΜ͜Ε΋தͰಉ͜͡ͱͯ͠·͢Ͷ

Slide 28

Slide 28 text

function doSomething(LoggerInterface $logger) { // ... $logger->error('...'); } ͞Βʹɺ࠾༻ͨ͠ϥΠϒϥϦ͕ 143ʹ४ڌ͍ͯ͠Ε͹ ࣮૷ϥΠϒϥϦΛ໰Θͣ࢖͍ํ͕ಉ͡ ͜ͷΠϯλʔϑΣʔεͷൣғͰ࢖͏͔͗Γ

Slide 29

Slide 29 text

$container->get('service'); $container->has('service'); 143 ͦ͏ͩɺαʔϏεࣗମ͚ͩͰͳ͘ ͦͷೖΕ෺ʹ΋ඪ४ΠϯλʔϑΣʔεΛ

Slide 30

Slide 30 text

ϑϨʔϜϫʔΫ࡞ऀ ϥΠϒϥϦ࡞ऀ ΞϓϦέʔγϣϯ։ൃऀ PSRs with PSR-11

Slide 31

Slide 31 text

ͱ͜Ζ͕

Slide 32

Slide 32 text

1.3 Recommended usage Users SHOULD NOT pass a container into an object so that the object can retrieve its own dependencies. This means the container is used as a Service Locator which is a pattern that is generally discouraged.

Slide 33

Slide 33 text

ίϯςφࣗମΛର৅ΦϒδΣΫτʹ౉ͯ͠ɺࣗྗ Ͱίϯςφ͔ΒґଘΛऔΓग़ͤ͞ΔΑ͏ͳ࢖͍ํ ͸4)06-%/05ͩͥɻ ίϯςφΛ͋ͷʮͩΊͩ͜ΓΌʯ͋Δ͋Δͳʮαʔ Ϗεϩέʔλʔʯͱͯ͠࢖ͬͪΌ͏͔Βͳɻ ҙ༁

Slide 34

Slide 34 text

$logger = $this->container->get('logger'); $logger->error('...'); 4)06-%/05 function setContainer( ContainerInterface $container )

Slide 35

Slide 35 text

4)06-%/05 app()->get('logger'); TheApp::$app->get('logger'); Log::error('...'); ʮ͓લ΋Ͳ͏ͤ4)06-%/05ͳԿ͔Ͱ࡞ΒΕͱΔ΍Ζʯ ʮάϩʔόϧͳΒͬͯ༨ܭ͔͋ΜΘʯ

Slide 36

Slide 36 text

%# -PH 4FDVSJUZ ίϯςφ ͲΕͰ΋޷͖ͳͷ࢖͍์୊ͩͥ ΍ͬͨશ෦΋Βͬͨ ʮͩΊͩ͜ΓΌʯͰ༗໊ͳ αʔϏεϩέʔλʔ͞Μͱ͸

Slide 37

Slide 37 text

·͞ʹάϩʔόϧؔ਺ ϑϦʔμϜϫʔϧυ ͦ͜Ͱ

Slide 38

Slide 38 text

ґଘੑ஫ೖ %FQFOEFODZ *OKFDUJPO %*

Slide 39

Slide 39 text

class Foo { protected $logger; public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } public function bar() { $this->logger->error('...'); } } ʮऔΓʹߦ͔ͳ͍ʯ ʮ༩͑ͯ΋Β͏ʯ

Slide 40

Slide 40 text

$container->set('foo', function () use ($container) { $object = new Foo(); $object->setLogger($container->get('logger')); return $object; }); class Foo { public function setLogger(LoggerInterface $logger) public function bar() } ੜ੒ ࢖༻ ෼཭ ˞͜Ε͸ઃఆϑΝΠϧ಺ͳͷͰػೳ࣮૷Ͱ͸͋Γ·ͤΜ

Slide 41

Slide 41 text

$response = $container->get('applicationRoot') ->handle($request); JOEFYQIQ ґଘੑ஫ೖͷνΣʔϯͰػೳΛߏ੒͢Δͱ ڀۃɺαʔϏεऔಘͱ࢖༻͕ ಉ࣌ʹى͖Δͷ͕ՕॴʹͳΔ

Slide 42

Slide 42 text

%# -PH 4FDVSJUZ ίϯςφ %*ίϯςφͷੈք -PHͱ4FDVSJUZΛࠩ͠ࠐΊ͹ ಈ͘෦඼ͷઃܭਤͩΑ DMBTT DMBTT JOEFYQIQ

Slide 43

Slide 43 text

༩͑ͨ΋ͷ͔͠ઈରʹ࢖Θͳ͍ ୭͕͍ͭԿΛ࢖͏͔Θ͔Βͳ͍ ҆৺ͳͷͰ

Slide 44

Slide 44 text

class FooTest extends TestCase { protected $foo; protected function setUp() { $this->foo = new Foo(); $this->foo->setLogger(new NullLogger()); } } ʮ७ਮʯͳ୯ମςετՄೳ ґଘʹμϛʔΛೖΕ͓͚ͯ͹0, ςετର৅ΦϒδΣΫτ͸ ίϯςφʹԿ΋औΓʹߦ͔ͳ͍ ʮ୯ମʯςετʹʮίϯςφηοτΞοϓʯ͕ඞཁʹͳΔ͋ͷҧ࿨ײͷղফ

Slide 45

Slide 45 text

७ਮͳ୯ମςετ ˠςετϑΝʔετ͕؆୯ʹ ίϯςφ ? 1)16OJU

Slide 46

Slide 46 text

ૄ݁߹ສࡀ ςετۦಈ։ൃສࡀ Ͱ͔͢

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

͋ͳ͕ͨཉ͍͠ͷ͸ɺ ػೳϑϨʔϜϫʔΫͷઃܭϑϨʔϜϫʔΫͰ͔͢ ͦΕͱ΋ɺ͍·͙͢࢖͑ΔઃܭࡁΈͷࠎ૊ΈͰ͔͢

Slide 49

Slide 49 text

TDB⒎PME DPOpHVSBUJPO ػೳϑϨʔϜϫʔΫͷ ઃܭϑϨʔϜϫʔΫ ͍·͙͢࢖͑Δ ઃܭࡁΈͷࠎ૊Έ

Slide 50

Slide 50 text

1)1JTΦϒδΣΫτ ࢦ޲ݴޠ

Slide 51

Slide 51 text

1)1JTBMTPކݴޠ

Slide 52

Slide 52 text

ΞϓϦέʔγϣϯ ςετࡁΈ044 ϢʔβʔϥΠϒϥϦ ކΛΘ͖·͑ͨബ͞Ͱ ΞϓϦέʔγϣϯ͕ॻ͚ΔͳΒ ͜Ε͚ͩςετͰ͖ͯΕ͹ ͜ͷྔͰີ݁߹ͷԿ͕ѱ͍ UFTUFE

Slide 53

Slide 53 text

ߏ੒PSද૚ ຊ࣭తͳ࢖༻໨తͷ͕͍ͪ ͋ΒΏΔධՁ࣠Ͱɺ͜ͷΑ͏ͳ ରൺ͕੒ΓཱͭͷͰ͸

Slide 54

Slide 54 text

'"2 ʮͲΕ͕ྑ͍Ͱ͔͢ ʯ

Slide 55

Slide 55 text

"ຊ࣭ΛݟۃΊ ৗʹରൺ͢΂͠

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

ͻͱͭͷݴޠɺଟ༷ͳࢥ૝ 1)1JT ֶͼͷଟ͍ݴޠ