injekce nefunguje – funguje jen predani v konstruktoru
- radik
- Člen | 21
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
- ViPEr*CZ*
- Člen | 818
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).
- ViPEr*CZ*
- Člen | 818
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.