Jak nastavím dependency injection v neonu
- tttpapi
- Člen | 100
Ahoj,
viděl jsem už asi milion prezentací a videí a já nevím všeho.
Ve všech se pořád dokola vykládá, jak si všechno předávám konstruktorem
atd.
Nikde jsem ale neviděl, jak si nastavím ten neon, aby se mi to pak začalo
předávat.
Mohl by mi někdo prosím říct úplně jednoduše, co si mám do toho (a kam) configu zadat?
př. mám komponentu NactiClanek, v konstruktoru mám
<?php
constructor(\App\Model\Document $documentModel)
?>
Volám si ji v HomepagePresenter
<?php
public function createComponentNewDirectives() {
return new \NewDirectivesList($this->documentsModel);
}
?>
Co mám všude vyplnit, aby mi to takhle opravdu fungovalo a já si nemusel nikde to dokument vytvořit?
Moc díky.
- Pavel Macháň
- Člen | 282
tttpapi napsal(a):
Ahoj,
viděl jsem už asi milion prezentací a videí a já nevím všeho.
Ve všech se pořád dokola vykládá, jak si všechno předávám konstruktorem atd.
Nikde jsem ale neviděl, jak si nastavím ten neon, aby se mi to pak začalo předávat.Mohl by mi někdo prosím říct úplně jednoduše, co si mám do toho (a kam) configu zadat?
př. mám komponentu NactiClanek, v konstruktoru mám
<?php constructor(\App\Model\Document $documentModel) ?>
Volám si ji v HomepagePresenter
<?php public function createComponentNewDirectives() { return new \NewDirectivesList($this->documentsModel); } ?>
Co mám všude vyplnit, aby mi to takhle opravdu fungovalo a já si nemusel nikde to dokument vytvořit?
Moc díky.
Předáš závislost pomocí konstruktoru nebo @inject anotace… Nette samo injectne do presenteru to co potřebuje v konstruktou
/** @var \MyModel*/
private $myModel;
public function __construct(\MyModel $myModel) {
parent::__construct();
$this->myModel= $myModel;
}
public function createComponentNewDirectives() {
return new \MyComponent($this->myModel);
}
Pokud nechces ručně v createComponent plnit konstruktor komponenty tak použiješ automaticky generovaný továrničky.
Do konfigurace vložíš továrničku na komponentu
services:
- IMyComponentFactory
Továrnička
interface IMyComponentFactory{
/** @return \MyComponent */
public function create();
}
Použití v presenteru
/** @var \IMyComponentFactory*/
private $myComponentFactory;
public function __construct(\IMyComponentFactory $myComponentFactory) {
parent::__construct();
$this->myComponentFactory= $myComponentFactory;
}
/** @return \MyComponent */
public function createComponentCampaignPreview() {
return $this->myComponentFactory->create();
}
nebo pomocí @inject anotace
/** @var \IMyComponentFactory @inject */
public $myComponentFactory;
/** @return \MyComponent */
public function createComponentCampaignPreview() {
return $this->myComponentFactory->create();
}
Editoval EIFEL (18. 6. 2014 11:33)
- Pavel Macháň
- Člen | 282
tttpapi napsal(a):
Díky, šlo mi ale hlavně o to, co mám napsat do config.neonu a kam.
Jestli to mám dát do services? A jakou to má mít strukuru?services:
nazevkomponenty: NazevKomponenty(@zavislost)?
Takto a nedáváš tam komponentu ale službu co potřebuje komponenta
services:
- MujModel
Pokud nepotrebujes rucne tu sluzbu v configu předávat nemusíš ji dávat
jméno
Závisloti nemusíš taky vyplňovat pokud tam není nutno ručně
předat službu
instanci komponenty si buď vytvoříš ručně a předáš ji její závislosti, které si dostaneš do presenteru(komponenty) a nebo použiješ tu automaticky generovanou továrničku a ta to udělá za tebe.
Editoval EIFEL (18. 6. 2014 12:26)