injekce nefunguje – funguje jen predani v konstruktoru

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

Cau,
chtel jsem se zeptat co delam spatne. Pokud v HomepagePresenter udelam tohle:
/**
* @inject
* @var \Kdyby\Doctrine\EntityManager
*/
public $EntityManager;

Tak v $EntityManager mam to co tam ma skutecne byt.

Pokud si udelam novou tridu ve ktere udelam to samy a pak novou tridu vytvarim v HomePresenter:
$xxx = new Models\Service\clankyService();

tak uz v $EntityManager mam NULL. Kdyz zkusim predat konstruktorem, tak me vse funguje.

Co delam spatne? Nebo se na to vykaslat a inject nepouzivat a vsechno delat pres konstruktor? Dik

JZechy
Člen | 161
+
0
-

Injekce funguje jen u presenterů, u services musíš předávat konstruktorem nebo settery.

radik
Člen | 21
+
0
-

A nejaka moznost, abych nemusel v presenteru delat injekci a pak to predat do services? Udelat tohle nefunguje taky (a v presenteru ano):

public function __construct(\Kdyby\Doctrine\EntityManager $ent)
{
$this->EntityManager = $ent;
}

Dik

ViPEr*CZ*
Člen | 818
+
0
-

Do services to dostanete tak, že závislosti předáte v konstruktoru. A v presenteru si injectujete už konkrétní services. Je nesmysl injektovat do Presenteru servisu A a servisu B a poté servisu A předat do B. A už vůbec nedělejte, že by jste si injectoval třeba ten EntityManager a pak přes new vytvořil clankyService a přes konstruktor vložil ten EntityManager. To nechte právě udělat automaticky nette (autowire) zaregistrováním do config.neon obou těch tříd a už si nechte jen vrátit do Presenteru nějakou instanci (inject).

radik
Člen | 21
+
0
-

Tak ted nevim jak je to mysleno. Jak mam v clankyService naplnit $this->EntityManager, abych nemusel predavat z HomePresenteru? Dik

ViPEr*CZ*
Člen | 818
+
+3
-
use \Kdyby\Doctrine\EntityManager;

class clankyService {
	private $entityManager;

	public function __construct(EntityManager $entityManager) {
		$this->entityManager = $entityManager;
	}
}

tak a predpokladejme, ze trida EntityManager je z Doctrine a mate ji includovanou.
Teď v config.neon:

services:
	- \Kdyby\Doctrine\EntityManager
	- clankyService

Tak a Nette se přes tzv. autowiring postará, aby se EntityManager dostal do clankyService.
A v Presenteru:

class HomepagePresenter extends BasePresenter {

	/** @var clankyService @inject */
	public clankyService;
}

No a takto se Vám do clankyService dostal EntityManager, kterej tam poslalo Nette automaticky. Do Presenteru jste si jen injectoval instanci clankyService, která už v sobě manager má. A můžete volat její členské veřejné metody, které mohou object EntityManager používat.