Používání Interface v nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondraondra81
Člen | 82
+
0
-

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
+
+1
-

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
+
0
-

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