03/2015 / Milan "perún" Herda / @moriquend / hrad.perunhq.org
Inversion of Control (IoC) je princíp, kedy sa uprednostňuje kontrola ZVONKU objektu nad situáciou, kedy si tento objekt sám hovorí, čo v rámci svojho kódu potrebuje.
Toto sú pravidlá, ktoré je potrebné mať stále na pamäti.
$a = new A;
$b = new B;
$b->hello();
Ukradnutá z Grudlovho článku o DI
class A
{
/** @var CacheInterface */
public $cache;
}
//...
$cache = new Cache();
$a = new A;
$a->cache = $cache;
class A
{
/** @var CacheInterface */
private $cache;
public function setCache(CacheInterface $cache)
{
$this->cache = $cache;
}
}
//...
$cache = new Cache();
$a = new A;
$a->setCache($cache);
class A
{
/** @var CacheInterface */
private $cache;
public function injectCache(CacheInterface $cache)
{
$this->cache = $cache;
}
}
//...
$cache = new Cache();
$a = new A;
$a->injectCache($cache);
class A
{
/** @var CacheInterface */
private $cache;
public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}
}
//...
$cache = new Cache();
$a = new A($cache);
$a->__construct($anotherCache);
Toto nám vezme náš stabilný stav.
Zavolať takýto kód môže hocikto, kto má prístup k $a
Nevadí, je to sviňárna a povedzme, že to nikto neurobí.
Takže: constructor injection!
Separation of concerns
Definícia služieb poskytovaných DIC sa často nepíše ako PHP kód, ale ako konfigurácia
Služby sa zväčša vytvárajú až vo chvíli, keď ich niečo chce použiť.
Service Locator je iné použitie DI containeru.
Do objektu sa vloží celý DIC namiesto jednotlivých závislostí
Objekt si potom závislosti vyťahuje z containeru podľa potreby
To znie dobre, nie?