Konfiguracija zabojnika DI

Pregled možnosti konfiguracije za zabojnik Nette DI.

Datoteka za konfiguracijo

Zabojnik Nette DI je mogoče preprosto upravljati s konfiguracijskimi datotekami. Običajno so zapisane v formatu NEON. Za urejanje priporočamo uporabo urejevalnikov s podporo za ta format.

 decorator: 	Decorator
di: DI Container
extensions: Namesti dodatne razširitve DI
includes: Vključuje datoteke
parameters: Parametri
search: Samodejna registracija storitev
services: Storitve

Zapisovanje niza, ki vsebuje znak %, you must escape it by doubling it to %%.

Parametri

Opredelite lahko parametre, ki jih lahko nato uporabite kot del definicij storitev. To lahko pomaga pri ločevanju vrednosti, ki jih boste želeli bolj redno spreminjati.

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

Na parameter foo se lahko sklicujete prek %foo% drugje v kateri koli konfiguracijski datoteki. Uporabite jih lahko tudi znotraj nizov, kot je '%wwwDir%/images'.

Parametri niso nujno samo nizi, lahko so tudi vrednosti v obliki polj:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Posamezen ključ lahko označite kot %mailer.user%.

Če morate v kodi, na primer v razredu, dobiti vrednost katerega koli parametra, ga predajte temu razredu. Na primer v konstruktorju. Ni globalnega konfiguracijskega objekta, ki bi ga razredi lahko poizvedovali po vrednostih parametrov. To bi bilo v nasprotju z načelom vbrizgavanja odvisnosti.

Storitve

Glej posebno poglavje.

Dekorator

Kako množično urediti vse storitve določene vrste? Ali morate poklicati določeno metodo za vse predstavnike, ki dedujejo po določenem skupnem predniku? Od tod prihaja dekorator.

decorator:
	# za vse storitve, ki so primerki tega razreda ali vmesnika.
	App\UI\BasePresenter:
		setup:
			- setProjectId(10)       # pokliče to metodo
			- $absoluteUrls = true   # in nastavi spremenljivko

Dekorator lahko uporabite tudi za nastavitev oznak ali vklop načina injiciranja.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

Tehnične nastavitve vsebnika DI.

di:
	# prikazuje DIC v Tracy Baru?
	debugger: ...        # (bool) privzeto true

	# vrste parametrov, ki jih nikoli ne povežete samodejno
	excluded: ...        # (string[])

	# razred, iz katerega podeduje vsebnik DI
	parentClass: ...     # (string) privzeto Nette\DI\Container

Izvoz metapodatkov

Tudi razred vsebnika DI vsebuje veliko metapodatkov. Zmanjšate jih lahko tako, da zmanjšate izvoz metapodatkov.

di:
	export:
		# za izvoz parametrov?
		parameters: false   # (bool) privzeto true

		# izvoziti oznake in katere?
		tags:               # (string[]|bool) privzeto so vsi
			- event.subscriber

		# izvozi podatke za samodejno napeljavo in katere?
		types:              # (string[]|bool) privzeto so vsi
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Če ne uporabljate polja $container->getParameters(), lahko onemogočite izvoz parametrov. Poleg tega lahko izvozite samo tiste oznake, prek katerih pridobivate storitve z uporabo metode $container->findByTag(...). Če metode sploh ne kličete, lahko izvoz značk popolnoma onemogočite z metodo false.

Metapodatke za samodejno vnašanje lahko bistveno zmanjšate tako, da razrede, ki jih uporabljate, določite kot parameter metode $container->getByType(). In še enkrat, če metode sploh ne pokličete (ali samo v bootstrap, da dobite Nette\Application\Application), lahko izvoz popolnoma onemogočite s false.

Razširitve

Registracija drugih razširitev DI. Tako na primer dodamo razširitev DI Dibi\Bridges\Nette\DibiExtension22 pod imenom dibi:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Nato jo konfiguriramo v njenem razdelku z imenom tudi dibi:

dibi:
	host: localhost

Dodate lahko tudi razširitveni razred s parametri:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)

Vključevanje datotek

Dodatne konfiguracijske datoteke lahko vstavite v razdelek includes:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

Ime parameters.php ni tipkarska napaka, konfiguracijo lahko zapišete tudi v datoteko PHP, ki jo vrne kot polje:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, se prepišejo ali združijo v primeru polj. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja. Datoteka, v kateri je naveden razdelek includes, ima višjo prednost kot datoteke, ki so vanjo vključene.

Zaradi samodejnega dodajanja storitev v vsebnik DI je delo zelo prijetno. Nette v vsebnik samodejno doda predstavnike, vendar lahko enostavno dodate tudi katere koli druge razrede.

Samo določite, v katerih imenikih (in podimenikih) naj se razredi iščejo:

search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

Običajno ne želimo dodati vseh razredov in vmesnikov, zato jih lahko filtriramo:

search:
	-	in: %appDir%/Forms

		# filtriranje po imenu datoteke (niz|recept[])
		files:
			- *Factory.php

		# filtriranje po imenu razreda (string|string[])
		classes:
			- *Factory

Lahko pa izberemo razrede, ki dedujejo ali implementirajo vsaj enega od naslednjih razredov:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

Določite lahko tudi negativna pravila, tj. maske imen razredov ali prednikov, in če so v skladu z njimi, storitev ne bo dodana v vsebnik DI:

search:
	-	in: %appDir%
		exclude:
datoteke: ...
			classes: ...
			extends: ...
			implements: ...

Za dodane storitve lahko nastavite oznake:

search:
	-	in: %appDir%
		tags: ...

Združevanje

Če se elementi z istimi ključi pojavijo v več konfiguracijskih datotekah, se prepišejo ali združijo v primeru polj. Kasneje vključena datoteka ima večjo prednost.

config1.neon config2.neon rezultat
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Če želite preprečiti združevanje določenega polja, uporabite izklicnik takoj za imenom polja:

config1.neon. config2.neon rezultat
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
različica: 3.x