inject v příkladu CD-collection

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

Zdravím, nějakou dobu jsem Nette neviděl. Posledně mně spoustu práce ušetřila verze 0.9. Teď potřebuju udělat něco nového a vidím, že se hodně změnilo.

Prohlížím příklad CD-collection a tam se nachází toto:

	private $albums;

	public function inject(AlbumRepository $albums)
	{
		$this->albums = $albums;
	}

Což má asi za úkol vytvořit instanci modelu AlbumRepository a uložit ji do proměnné $this->albums, aby se pak mohla použít k operacím s databází. Asi se to v jednotlivých metodách nemusí volat, provede se to „samo“. Hledal jsem o tom něco v dokumentaci nebo na fóru a všude se to hemží zmínkami o dependency injection, ale nějaké jednoduché vysvětlení nemůžu najít.

Můžete mi prosím vysvětlit co to je, jak Nette pozná, že to má vykonat a proč je to lepší než $albums = new AlbumRepository;?

Dík.

enumag
Člen | 2118
+
0
-

Články o DI obecně najdeš na phpFashion.

Nette to pozná tak že po vytvoření presenteru automaticky zavolá metody inject* a do parametrů nastrká služby, které daná inject metoda chce – v tomto případě službu typu AlbumRepository.

$albums = new AlbumRepository; nelze použít, protože AlbumRepository potřebuje ještě připojení k databázi a to nemáš kde vzít. Mohl bys ho někde magicky vytáhnout, ale to je proti DI (principy DI si vyčti v článkách). Kromě toho bys pak snadno mohl získat více instancí AlbumRepository v jedné aplikaci, což není žádoucí.

Editoval enumag (17. 1. 2013 14:28)

jarnov
Člen | 2
+
0
-

Díky, podívám se na to. Snad to pochopím dřív, než prošvihnu termín.

Přimlouvám se za nováčky, jestli by nebylo možné do toho příkladu dát aspoň malý komentář. Něco jako jste napsal Vy: „Nette po vytvoření presenteru automaticky zavolá metody inject a do parametrů nastrká služby, které daná inject metoda chce“. Na to jsem nikde nenatrefil. Klidně to může být anglicky.

Další začátečnická otázka může být např. „kde se v modelu AlbumRepository vezme hodnota proměnné $database“. Atd. Přecejen to má být názorný příklad.

enumag
Člen | 2118
+
0
-

Procházel jsem dokumentaci presenterů, DI a konfigurace. Výsledek: zmínku o automatickém volání inject* metod jsem nenašel. Jediná o které vím je na konci článku na phpFashion.

Odpovědí na tu další otázku je auto-wiring.