Injekce služby z presenteru

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

Ahoj,

tak už zase otravuju :)

V BasePresenteru vytvářím komponentu, jelikož ji potřebuju všude takto:

public function __construct(Nette\Database\Context $database) //konstruktor basepresenteru
    {
        $this->database = $database;
    }

protected function createComponentKategorie() {

        $control = new \CategoryControl();
	$control->SetService($this->database);

	return $control;
    }

V catecorycontrol.php pak mám:

public function SetService($service)
            {
                $this->connection = $service;
            }

No a když chci dále v catecorycontrol.php přistoupit k databázi přes $this->connection. Tak to nejde. Chová se to jak kdyby se ta služba databáze z basepresenteru nepřeposlala. Jde to vůbec tímhle způsobem injektovat? Pokud ne jak to udělat resp. zprovoznit :) díky za rady

Oli
Člen | 1215
+
0
-

@Spectrik Jakoukoli třídu si zaregistruješ do DI si ji potom můžeš injectnout kam chceš (pokud to kam injectujes je taky v DI). Takže tobě stačí zaregistrovat CategoryControl jako service (nebo ještě lépe vytvořit továrničku jak už psal @CZechBoY) a tu službu (nebo parametr, jinou továrničku…) si můžeš injectnout přímo do konstruktoru v CategoryControl a nemusíš to předávat přes setter.

btw. ten kod co jsi poslal by fungovat měl. V presenteru ti to funguje?

Azathoth
Člen | 495
+
0
-

Myslím, že bude lepší, když si na komponentu uděláš továrnu a připojení k databázi budeš do komponenty vkládat v té továrně.
https://doc.nette.org/…dependencies#…

Spectrik
Člen | 23
+
0
-

Ok, díky všem. Teď už si s tím poradím.