Používání Interface v nette
- ondraondra81
- Člen | 82
Ahoj,
snažím se začít používat v nette (i v php) interface, ale tak nějak
jsme se v tom ztratil a potřeboval bych nakopnout správným směrem.
uvedu příklad.
Budu mít komponentu ve třídě Gallery, která se stará o správu
galerie.
Pro ukládání dat si definuji že daná třída musí implementovat Interface
IDataStorage
tzn. mám
class Gallery
{
/** @var IDataStorage $storage */
private $storage
public function __construct(IDataStorage $storage)
{
$this->storage = $storage;
}
// .......
}
nasledne pak
class DBStorage implements IDataStorage
{
....
}
class FileStorage implements IDataStorage
{
....
}
jak nette řeknu kterou z těch tříd implementujích dané rozhraní má použít?
hádám, že asi nějak v konfigu, ale nevím jak :(
- David Kudera
- Člen | 455
Například takto:
services:
- FileStorage
- Gallery
Nette uvidí jen jednu službu typu IDataStorage
, takže tu taky
automaticky injectne do služby Gallery
no a pokud to budeš potřebovat někdy vyměnit, tak jen v configu
přepíšeš FileStorage
na DBStorage
.
Nebo to můžeš udělat tak, jak funguje třeba cache. V nette je
registrovaná služba ICacheStorage
(normálně je to
FileStorage
) a když chceš cache, tak si sám vytvoříš instanci
cache a předáš ji storage, jaký potřebuješ.
public function __construct(ICacheStorage $cacheStorage)
{
$this->cache = new Cache($cacheStorage, 'someNamespace');
}
potom by jsi měl v configu registrovaný jen ten potřebný storage. No a
pokud jich potřebuješ víc různých a na každém místě použít jiný
storage (to ale možná nebude úplně ideální), tak si ho necháš injectnout
pomocí třeba FileStorage
a ne přes interface
IDataStorage
. Čili registrované je budeš mít všechny
(storage), ale vždy si vybereš, který injectnout. Jo a nebude to automaticky,
protože nette by nevědělo, který má vybrat a vyhodilo by výjimku
Editoval David Kudera (22. 8. 2014 17:16)
- ondraondra81
- Člen | 82
Ahoj,
díky tato informace mě stačí :Nette uvidí jen jednu službu typu
IDataStorage, takže tu taky automaticky injectne do služby Gallery