Nette Documentation Preview

syntax
Konfiguracija zabojnika DI
**************************

.[perex]
Pregled možnosti konfiguracije za zabojnik Nette DI.


Datoteka za konfiguracijo .[#toc-configuration-file]
====================================================

Zabojnik Nette DI je mogoče preprosto upravljati s konfiguracijskimi datotekami. Običajno so zapisane v [formatu NEON |neon:format]. Za urejanje priporočamo uporabo [urejevalnikov s podporo za |best-practices:editors-and-tools#ide-editor] ta format.

<pre>
"decorator .[prism-token prism-atrule]":[#Decorator]: 	"Decorator .[prism-token prism-comment]"<br>
"di .[prism-token prism-atrule]":[#DI]: 			"DI Container .[prism-token prism-comment]"<br>
"extensions .[prism-token prism-atrule]":[#Extensions]: 	"Namesti dodatne razširitve DI .[prism-token prism-comment]"<br>
"includes .[prism-token prism-atrule]":[#Including files]: 	"Vključuje datoteke .[prism-token prism-comment]"<br>
"parameters .[prism-token prism-atrule]":[#Parameters]: 	"Parametri .[prism-token prism-comment]"<br>
"search .[prism-token prism-atrule]":[#Search]: 		"Samodejna registracija storitev .[prism-token prism-comment]"<br>
"services .[prism-token prism-atrule]":[services]: 		"Storitve .[prism-token prism-comment]"
</pre>

Zapisovanje niza, ki vsebuje znak `%`, you must escape it by doubling it to `%%`. .[note]


Parametri .[#toc-parameters]
============================

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.

```neon
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:

```neon
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 .[#toc-services]
=========================

Glej [posebno poglavje |services].


Dekorator .[#toc-decorator]
===========================

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.

```neon
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 |services#Tags] ali vklop [načina injiciranja |services#Inject Mode].

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


DI
===

Tehnične nastavitve vsebnika DI.

```neon
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 .[#toc-metadata-export]
------------------------------------------

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

```neon
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 |autowiring] 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 [application:bootstrap], da dobite `Nette\Application\Application`), lahko izvoz popolnoma onemogočite s `false`.


Razširitve .[#toc-extensions]
=============================

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

```neon
extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22
```

Nato jo konfiguriramo v njenem razdelku z imenom tudi `dibi`:

```neon
dibi:
	host: localhost
```

Dodate lahko tudi razširitveni razred s parametri:

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


Vključevanje datotek .[#toc-including-files]
============================================

Dodatne konfiguracijske datoteke lahko vstavite v razdelek `includes`:

```neon
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
<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];
```

Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, se [prepišejo ali združijo |#Merging] 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.


Iskanje .[#toc-search]
======================

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:

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

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

```neon
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:


```neon
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:

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

Za dodane storitve lahko nastavite oznake:

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


Združevanje .[#toc-merging]
===========================

Č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.

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>rezultat</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
	<td>
```neon
items:
	- 1
	- 2
	- 3
```
	</td>
</tr>
</table>

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

<table class=table>
<tr>
	<th width=33%>config1.neon.</th>
	<th width=33%>config2.neon</th>
	<th>rezultat</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items!:
	- 3
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
</tr>
</table>


{{maintitle: Konfiguracija vrivanja odvisnosti}}

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