Neon – class: Article(…, %id%)

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

Ahoj kamaráti,
Mohol by mi prosím vás niekto vysvetliť doleuvedený kód? Konkrétne to aku úlohu tam zohrávajú tie tri bodky a ako sa do výsledného kódu dostane to $this->database? To už na úrovni konfigu funguje injektovanie, či ako?

factories:
    article:
        parameters: [id, title: null]
        class: Article(..., %id%)
        setup:
            - $title(%title%)
Vygeneruje:

function createArticle($id, $title = NULL)
{
    $service = new Article($this->database, $id);
    $service->title = $title;
    return $service;
}

Ďakujem.

Editoval Čamo (21. 7. 2014 14:44)

Šaman
Člen | 2666
+
0
-

Tři tečky znamenají, že se nejprve provede autowiring pomocí typehintu a pak se ještě předá $id. Kdybys dal $id jako první parametr v konstruktoru třídy Article, tak ty tři tecky uvádět nemusíš – předá se do konstruktoru $id a zbytek zpracuje autowiring.

Ano, databáze se tam dostala autowiringem.


Jakou máš verzi Nette? Sekce factories už je od 2.1 deprecated, dnes se na všechno používá sekce services.


Pozn2: V reakci na tvé: „To už na úrovni konfigu funguje injektovanie, či ako?“
Autowiring, tedy automatické injectování, funguje JEN při vytváření třídy DI kontejnerem, tedy vpodstatě jen na úrovni konfigu. Pokud nějakou třídu vytvoříš operátorem new, tak se žádný autowiring neprovede. Jen u presenterů je to skryté – i presentery se vytváří v kontejneru, ale do configu se psát nemusí. U ostatních služeb platí, že ‚injectování‘ funguje jen pokud jsi je uvedl v configu.

Editoval Šaman (21. 7. 2014 14:56)

Čamo
Člen | 798
+
0
-

Šaman
Ten kód je z dokumentácie.
No a keď chcem dnes vytvoriť továreň, tak sa to rieši cez multiplier, či ako, keď je to deprecated?(dúfam, že som neni moc mimo).

Šaman
Člen | 2666
+
0
-

Ne, jen nepoužíváš sekci factories, ale všechno píšeš pod services.

Čamo
Člen | 798
+
0
-

Dobre teda, ďakujem.