Slide 1

Slide 1 text

5.5௚લʂ Container ৼΓฦΓ yuuki takezawa / ytake

Slide 2

Slide 2 text

Author • https://github.com/ytake/Laravel-Couchbase • https://github.com/ytake/Laravel-Aspect • https://github.com/ytake/Laravel.Smarty

Slide 3

Slide 3 text

Container!

Slide 4

Slide 4 text

class HogeFugaPiyo { public function nanika() { \App::make(‘aaa’); app(‘bbb’); } }

Slide 5

Slide 5 text

݁߹౓ߴ͠ μϝઈର

Slide 6

Slide 6 text

class HogeFugaPiyo { public function __construct(Application $app) { $this->app = $app; } }

Slide 7

Slide 7 text

Application ຊମ͸ඞཁͳ͍Ͱ͢ΑͶ

Slide 8

Slide 8 text

class Hoge { public $int = 1; }

Slide 9

Slide 9 text

class HogeFugaPiyo { public function __construct(Hoge $hoge) { $this->hoge = $hoge; } }

Slide 10

Slide 10 text

Πϯελϯεͷੜ੒ํ๏Λࢦఆ

Slide 11

Slide 11 text

// Hogeͱॻ͍ͯ͋ͬͨΒHogeΛ͍ͩ͘͞ $this->app->bind(Hoge::class, function () { return new Hoge; }); $this->app->bind(Hoge::class); // singletonͰ͍ͩ͘͞ $this->app->singleton(Hoge::class);

Slide 12

Slide 12 text

Πϯελϯεͷੜ੒ํ๏Λࢦఆ Ҿ਺͕ඞཁͳ৔߹

Slide 13

Slide 13 text

class Fuga { private $arg; public function __construct($arg) { $this->arg = $arg; } }

Slide 14

Slide 14 text

$this->app->bind(Fuga::class, function () { return new Fuga(1); });

Slide 15

Slide 15 text

Πϯελϯεͷੜ੒ํ๏Λࢦఆ ࠞ߹

Slide 16

Slide 16 text

class Piyo { private $hoge; private $fuga; public function __construct(Hoge $hoge, Fuga $fuga) { $this->hoge = $hoge; $this->fuga = $fuga; } }

Slide 17

Slide 17 text

$this->app->bind(Hoge::class, function () { return new Hoge; }); $this->app->bind(Fuga::class, function () { return new Fuga(1); });

Slide 18

Slide 18 text

// ৔߹ʹΑͬͯ͸͜Μͳͷ΋ $this->app->bind( Fuga::class, function (Application $app) { return new Fuga($app->make(‘nanika’)); });

Slide 19

Slide 19 text

Πϯελϯεੜ੒࣌ʹ ಛఆͷԿ͔Λ͍ͨ͠

Slide 20

Slide 20 text

class HogeFugaPiyo { private $name = ‘’; public function __construct(Hoge $hoge) { $this->hoge = $hoge; } public function setName(string $name) { $this->name = $name; } }

Slide 21

Slide 21 text

$this->app->extend( HogeFugaPiyo::class, function (HogeFugaPiyo $hoge) { $hoge->setName(“hoge”); return $hoge; }); * ଞʹ΋͋Γ·͢

Slide 22

Slide 22 text

ಛఆͷΫϥεΛܧঝͨ͠Ϋϥεͷ Πϯελϯε͕ੜ੒͞Εͨ࣌ʹ ͳʹ͔͍ͨ͠

Slide 23

Slide 23 text

abstract class AbstractHoge { private $name = ‘abstract’; public function setName(string $name) { $this->name = $name; } }

Slide 24

Slide 24 text

class Hoge extends AbstractHoge { }

Slide 25

Slide 25 text

$this->app->resolving( AbstractHoge::class, function (AbstractHoge $abstractHoge) { $abstractHoge->setName(‘aaaaa’); return $abstractHoge; });

Slide 26

Slide 26 text

ૄ݁߹ʹ͍ͨ͠

Slide 27

Slide 27 text

// constructorʹinterfaceΛॻ͖·͠ΐ͏ $this->app->bind(HogeInterface::class, Hoge::class);

Slide 28

Slide 28 text

Կ͔ͷ৚݅Ͱฦ٫͞ΕΔ ΠϯελϯεΛมߋ͍ͨ͠

Slide 29

Slide 29 text

use Illuminate\Support\Manager; class StringManager extends Manager { protected $driver = ‘hoge’; public function getDefaultDriver() { return $this->driver; } protected function createHogeDriver() { return ‘hoge dayo’; } protected function createFugaDriver() { return ‘fuga dayo’; } }

Slide 30

Slide 30 text

// constructorͰManagerΫϥε ܕએݴ $this->app->bind( StringManager::class, function(Application $app) { return new StringManager($app); });

Slide 31

Slide 31 text

protected $manager; public function __construct(StringManager $manager) { $this->manager = $manager; } public function __invoke($id) { $manager = $this->manager->driver(‘hoge’); if($id === 1) { $manager = $this->manager->driver(‘fuga’); } dd($manager); }

Slide 32

Slide 32 text

SOLIDͳAppΛʂ