DI: konfigurace služeb
Samotná konfigurace se obykle zapisuje v NEON souboru. Se syntaxí se můžete seznámit na stránce https://ne-on.org. V souboru můžeme nastavit
Konfigurační soubor je místem, kam umísťujeme definice vlastních služeb. Slouží k tomu sekce services
.
Například tato definice služby:
services:
database: Nette\Database\Connection(%dsn%, %user%, %password%)
# nebo ve dvou řádcích:
database:
factory: Nette\Database\Connection(%dsn%, %user%, %password%)
# nebo ve třech řádcích :-)
database:
class: Nette\Database\Connection
arguments: [%dsn%, %user%, %password%]
Setup
services:
database:
factory: Nette\Database\Connection(%dsn%, %user%, %password%)
setup:
- setCacheStorage(@cacheStorage)
Autowiring umí odkazy na jiné služby doplnit automaticky, takže lze parametry úplně vynechat:
setup:
- setCacheStorage
Pokud služba cacheStorage
neexistuje, můžeme jako parametr uvést výsledek volání funkce:
setup:
- setCacheStorage( Factory::createStorage() )
# nebo metody jiné služby:
- setCacheStorage( @factory::createStorage() )
Případně nově vytvořenou třídu:
setup:
- setCacheStorage( Nette\Caching\Storages\FileStorage(%tempDir%) )
Lze nastavovat i hodnoty proměnných:
substitutions
setup:
- $substitutions( [db: test] )
Kompletní příklad:
parameters:
database:
driver: mysql
host: localhost
dbname: test
user: jim
password: beam
substitutions:
db: test
services:
database:
factory: Nette\Database\Connection(
'%database.driver%:host=%database.host%;dbname=%database.dbname%',
%database.user%, %database.password%, null,
Nette\Database\Reflection\DiscoveredReflection()
)
setup:
- setCacheStorage
- $substitutions( %database.substitutions% )
Anonymní služby
Pojmenování služeb je vhodné hlavně ve chvíli, kdy na ně chceme odkazovat z jiných částí konfiguračního souboru. Pokud na službu již není odkazováno, není ji potřeba pojmenovávat. Pro anonymní služby použijte následující syntax:
services:
- Simple\Service
-
factory: Complex\Service
setup:
- setLang(%lang%)
Pokud však budete chtít později odkázat na anonymní službu, budete muset uvést úplný název třídy (rozhraní).
services:
router: @App\RouterFactory::createRouter
Také je potřeba mít na paměti, že z povahy anonymních služeb nelze mít registrovaných více instancí stejného typu, protože by nebylo možné je rozlišit.
Dědičnost služeb
services:
dev_database < database
setup:
- Diagnostics\ConnectionPanel::initialize
Auto-wiring
Auto-wiring umí automaticky předávat do konstruktoru a dalších metod požadované služby. Řídí se podle type hintů a
anotací @return
. Služba odpovídající hledané třídě musí být v kontejneru právě jedna, jinak se vyhodí
výjimka.
Pokud potřebujeme definovat více služeb stejného typu, můžeme je z auto-wiringu vyřadit:
services:
cacheStorage:
factory: Nette\Caching\Storages\FileStorage(%tempDir%)
tempCacheStorage:
factory: Nette\Caching\Storages\DevNullStorage
autowired: no
Pokud upravujeme základní služby Nette Frameworku, nesmíme se zapomenout ujistit, že kontejner zná třídy naší
implementace. Pokud tedy nastavujeme vlastní factory
pro službu, tak to znamená mít správně absolutní název
třídy v annotaci @return
, nebo nastavovat vždy i třídu do class
.
Více konfiguračních souborů
V případě, že chceme pro nastavení používat více propojených konfiguračních souborů, můžeme je uvést v sekci
includes
.
includes:
- parameters.php
- services.neon
- presenters.neon
Konfigurace se slučují tak, že nejvyšší prioritu má soubor obsahující sekci includes
a nejnižší první
vkládaný soubor. Slučování polí lze zabránit uvedením vykřičníku za název pole:
argument!: [1, 2, 3]