Ako správne injektovať a kedy vlastne

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

Zdravím vás,
Môže mi prosím vás niekto vysvetliť čo som nepochopil na injektovaní?
Mám BasePresenter do ktorého cez anotáciu @injekt injektnem Nette\Database\Context.

class BasePresenter extends ...presenter
{
	/** @var Nette\Database\Context @inject */
	$db;

No a v inom presentery chcem v konštruktore inštancovať nejakú modelovú triedu, ktorá v konštruktore čaká databázu.

class myPresenter extends BasePresenter
{
	protected $myModel;

	public function __construct()
	{
		$this->myModel = $new App\Model\myModel($this->db);
	}

To mi vyhodí error „must be an instance of Nette\Database\Context, null given“

Čo robím zle a ako to mám robiť správne?

Editoval Čamo (23. 1. 2015 0:02)

Oli
Člen | 1215
+
0
-

Pokud použiješ inject anotaci,tak proměnná musí být public. Pokud nechceš použít public, tak použij buď inject metodu nebo kdyby/autowire, který funguje stejně jako inject anotace, ale proměnná může být protected.

Zároveň to musí být zaregistrovaný v neonu.

Btw. není lepší si do presenteru předat rovnou myModel, který bude mít závislost na databázi?

David Matějka
Moderator | 6445
+
0
-

a v konstruktoru nejsou dostupne zavislosti ziskavane pres @inject anotace nebo inject* metody

Jinak jak rika @Oli – injectni si rovnou myModel

Šaman
Člen | 2666
+
+1
-

Defaultní property je public, tím to není. (Ale raději to tam vždy piš.)
Je to tím, že konstruktor v Nette slouží jen na předávání závislostí. Pomocí anotací, nebo inject metod se totiž dá do objektu něco předat až když je už vytvořený, tedy až po vykonání konstruktoru.
Proto existuje i metoda startup(), pro kterou platí stejné zásady jako pro kontruktor (vždy volat startup() předka), ale která se spustí až když je presenter vytvořený a nastavený. Takže použij tuto metodu (a doplň volání parent metody).

Čamo
Člen | 798
+
0
-

Ahá takže anotácie sú ešte neni dostupné. Takže buď startup alebo ijektovať do modelu.

Do modelu sa ako správne injektuje(best practise)? Tuším je tam nejaké obmedzenie nie? Ja to mám tak ako som písal, čo by vyžadovalo ten startup. Kdyby nepoznám…

Editoval Čamo (23. 1. 2015 10:53)

Oli
Člen | 1215
+
0
-

Nejlepsi je sito injectnout primo do toho modelu. Je to stejne jako by jsi to injectnul do presenter constructoru. Anotace injection v modelu nefungujou.

Pokud by jsi to chtel tak jak to mas ted, tak jen ten constructor prepis na startup. Nezapomen, ale volat predka. Ja bych to ale prepsal :-)

David Matějka
Moderator | 6445
+
+1
-

@Čamo je to v dokumentaci

Filip Procházka
Moderator | 4668
+
+1
-

Řekl bych že tohle video a tenhle příspěvek jsou pořád aktuální