Definování služeb
Konfigurace je místem, kam umísťujeme definice vlastních služeb. Slouží k tomu sekce
services
.
Například takto vytvoříme službu pojmenovanou database
, což bude instance třídy PDO
:
Pojmenování služeb slouží k tomu, abychom se na ně mohli odkazovat. Pokud na službu není odkazováno, není ji potřeba pojmenovávat. Místo názvu tak použijeme jen odrážku:
Jednořádkový zápis lze rozepsat do více řádků a tak umožnit přidání dalších klíčů, jako je například setup:
Službu poté získáme z DI kontejneru metodou getService()
podle názvu, nebo ještě lépe metodou
getByType()
podle typu:
Vytvoření služby
Nejčastěji službu vytváříme prostým vytvořením instance určité třídy:
Což vygeneruje tovární metodu v DI kontejneru:
Pro předání argumentů lze alternativně použít i klíč arguments
:
Službu může vytvořit také statická metoda:
Odpovídá PHP kódu:
Předpokládá se, statická metoda My\Database::create()
má definovanou návratovou hodnotu, buď pomocí
anotace @return
nebo type hintů v PHP 7, kterou DI kontejner potřebuje znát. Pokud ji nemá, zapíšeme typ do
konfigurace:
Nette DI nám dává mimořádně silné výrazové prostředky, pomocí kterých můžete zapsat téměř cokoliv. Například
se odkázat na jinou službu a zavolat její metodu. Pro jednoduchost se místo
->
používá ::
Odpovídá PHP kódu:
Volání metod lze řetězit za sebe stejně jako v PHP:
Odpovídá PHP kódu:
Argumenty
Pro předání argumentů lze používat i pojmenované parametry:
Při rozepsání argumentů do více řádků je používání čárek volitelné.
Jako argumenty můžeme samozřejmě použít i jiné služby nebo parametry:
Odpovídá PHP kódu:
Pokud se má první argument autowirovat a chceme přitom uvést argument druhý, vynecháme
první znakem _
, tedy např. Foo(_, %appDir%)
. Nebo ještě lépe předáme jen druhý argument jako
pojmenovaný parametr, např. Foo(path: %appDir%)
.
Nette DI a formát NEON nám dává mimořádně silné výrazové prostředky, pomocí kterých můžete zapsat téměř cokoliv. Argumentem tak může být nově vytvořený objekt, lze volat statické metody, metody jiných služeb, nebo pomocí speciálního zápisu i globální funkce:
Odpovídá PHP kódu:
Odkazování na služby
Na jednotlivé služby se odkazuje pomocí zavináče a názvu služby, takže například @database
:
Odpovídá PHP kódu:
I na anonymní služby se lze odkazovat přes zavináč, jen místo názvu uvedeme jejich typ (třídu nebo rozhraní). Tohle ovšem obvykle není potřeba dělat díky autowiringu.
Setup
V sekci setup uvádíme metody, které se mají zavolat při vytváření služby:
Odpovídá PHP kódu:
Lze také nastavovat hodnoty proměnných. Podporováno je i přidání prvku do pole, které je potřeba zapsat v uvozovkách, aby nekolidovalo se syntaxí NEON:
Odpovídá PHP kódu:
V setupu lze však volat i statické metody nebo metod jiných služeb. Aktuální službu jim předáme jako
@self
:
Odpovídá PHP kódu:
Autowiring
Pomocí klíče autowired lze službu vyřadit z autowiringu nebo jeho chování ovlivnit. Více v kapitole o autowiringu.
Tagy
Jednotlivým službám lze přidávat uživatelské informace v podobě tzv. tagů:
Tagy mohou mít i hodnotu:
Názvy služeb lze získat z DI kontejneru metodou findByTag()
:
Režim Inject
Pomocí příznaku inject: true
se aktivuje předávání závislostí přes veřejné proměnné s anotací inject a metody inject*().
V základním nastavení je inject
aktivováno pouze pro presentery.
Modifikace služeb
V DI kontejneru je řada služeb, které přidaly vestavěné nebo vaše rozšíření. Definice
těchto služeb lze v konfiguraci pozměnit. Třeba u služby application.application
, což je standardně objekt
Nette\Application\Application
, můžeme změnit třídu:
Příznak alteration
je informativní a říká, že jen modifikujeme existující službu.
Můžeme také doplnit setup:
Při přepisování služby můžeme chtít odstranit původní argumenty, položky setup nebo tagy, k čemuž slouží
reset
:
Službu přidanou rozšířením lze také z kontejneru odstranit: