Jak nastavím dependency injection v neonu

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

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
+
0
-

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)

tttpapi
Člen | 100
+
0
-

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)

?

Pavel Macháň
Člen | 282
+
0
-

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)