Injekce služby z presenteru
- Spectrik
- Člen | 23
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
@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
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#…