Nette Documentation Preview

syntax
Konfiguracija DI vsebnika
*************************

.[perex]
Pregled konfiguracijskih možnosti za Nette DI vsebnik.


Konfiguracijska datoteka
========================

Nette DI vsebnik se enostavno upravlja s konfiguracijskimi datotekami. Te se običajno zapisujejo v [formatu NEON|neon:format]. Za urejanje priporočamo [urejevalnike s podporo |best-practices:editors-and-tools#IDE urejevalnik] za ta format.

<pre>
"decorator .[prism-token prism-atrule]":[#decorator]: 	"Dekorator .[prism-token prism-comment]"<br>
"di .[prism-token prism-atrule]":[#DI]: 			"DI vsebnik .[prism-token prism-comment]"<br>
"extensions .[prism-token prism-atrule]":[#Razširitve]: 	"Namestitev dodatnih DI razširitev .[prism-token prism-comment]"<br>
"includes .[prism-token prism-atrule]":[#Vključevanje datotek]: 	"Vključevanje datotek .[prism-token prism-comment]"<br>
"parameters .[prism-token prism-atrule]":[#Parametri]: 	"Parametri .[prism-token prism-comment]"<br>
"search .[prism-token prism-atrule]":[#Iskanje]: 		"Samodejna registracija storitev .[prism-token prism-comment]"<br>
"services .[prism-token prism-atrule]":[services]: 		"Storitve .[prism-token prism-comment]"
</pre>

.[note]
Če želite zapisati niz, ki vsebuje znak `%`, ga morate ubežati z podvojitvijo na `%%`.


Parametri
=========

V konfiguraciji lahko definirate parametre, ki jih lahko nato uporabite kot del definicij storitev. S tem lahko naredite konfiguracijo preglednejšo ali združite in izločite vrednosti, ki se bodo spreminjale.

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

Na parameter `dsn` se sklicujemo kjerkoli v konfiguraciji z zapisom `%dsn%`. Parametre lahko uporabljamo tudi znotraj nizov kot `'%wwwDir%/images'`.

Parametri niso nujno samo nizi ali števila, lahko vsebujejo tudi polja:

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

Na določen ključ se sklicujemo kot `%mailer.user%`.

Če potrebujete v vaši kodi, na primer v razredu, ugotoviti vrednost katerega koli parametra, ga posredujte v ta razred. Na primer v konstruktorju. Ne obstaja noben globalni objekt, ki bi predstavljal konfiguracijo, katerega bi razredi spraševali za vrednosti parametrov. To bi bilo kršenje načela dependency injection.


Storitve
========

Glej [samostojno poglavje|services].


Decorator
=========

Kako množično urediti vse storitve določenega tipa? Na primer poklicati določeno metodo pri vseh presenterjih, ki dedujejo od določenega skupnega prednika? Za to je tu decorator.

```neon
decorator:
	# pri vseh storitvah, ki so instanca tega razreda ali vmesnika
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # pokliči to metodo
			- $absoluteUrls = true   # in nastavi spremenljivko
```

Decorator se lahko uporablja tudi za nastavitev [oznak |services#Oznake] ali vklop načina [inject |services#Način Inject].

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


DI
===

Tehnične nastavitve DI vsebnika.

```neon
di:
	# prikazati DIC v Tracy Bar?
	debugger: ...        # (bool) privzeto je true

	# tipi parametrov, ki jih nikoli ne avtomatsko povezovati
	excluded: ...        # (string[])

	# dovoliti leno ustvarjanje storitev?
	lazy: ...            # (bool) privzeto je false

	# razred, od katerega deduje DI vsebnik
	parentClass: ...     # (string) privzeto je Nette\DI\Container
```


Lene storitve .{data-version:3.2.4}
-----------------------------------

Nastavitev `lazy: true` aktivira leno (odloženo) ustvarjanje storitev. To pomeni, da storitve niso dejansko ustvarjene v trenutku, ko jih zahtevamo iz DI vsebnika, ampak šele v trenutku njihove prve uporabe. To lahko pospeši zagon aplikacije in zmanjša pomnilniške zahteve, saj se ustvarijo samo tiste storitve, ki so v danem zahtevku dejansko potrebne.

Pri določeni storitvi lahko leno ustvarjanje [spremenimo |services#Lazy storitve].

.[note]
Lene objekte je mogoče uporabiti samo za uporabniške razrede, ne pa za interne PHP razrede. Zahteva PHP 8.4 ali novejšo različico.


Izvoz metapodatkov
------------------

Razred DI vsebnika vsebuje tudi veliko metapodatkov. Lahko ga zmanjšate tako, da zmanjšate izvoz metapodatkov.

```neon
di:
	export:
		# izvoziti parametre?
		parameters: false   # (bool) privzeto je true

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

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

Če ne uporabljate polja `$container->getParameters()`, lahko izklopite izvoz parametrov. Nadalje lahko izvozite samo tiste oznake, prek katerih pridobivate storitve z metodo `$container->findByTag(...)`. Če metode sploh ne kličete, lahko popolnoma izklopite izvoz oznak z `false`.

Znatno lahko zmanjšate metapodatke za [samodejnim povezovanjem |autowiring] tako, da navedete razrede, ki jih uporabljate kot parameter metode `$container->getByType()`. In spet, če metode sploh ne kličete (oz. samo v [bootstrapu|application:bootstrapping] za pridobitev `Nette\Application\Application`), lahko izvoz popolnoma izklopite z `false`.


Razširitve
==========

Registracija dodatnih DI razširitev. Na ta način dodamo npr. DI razširitev `Dibi\Bridges\Nette\DibiExtension22` pod imenom `dibi`

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

Nato jo torej konfiguriramo v sekciji `dibi`:

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

Kot razširitev lahko dodamo tudi razred, ki ima parametre:

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


Vključevanje datotek
====================

Druge konfiguracijske datoteke lahko vključimo v sekciji `includes`:

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

Ime `parameters.php` ni napaka, konfiguracija je lahko zapisana tudi v PHP datoteki, ki jo vrne kot polje:

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

Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru [polj združeni |#Združevanje]. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja. Datoteka, v kateri je navedena sekcija `includes`, ima višjo prioriteto kot v njej vključene datoteke.


Iskanje
=======

Samodejno dodajanje storitev v DI vsebnik izjemno olajša delo. Nette samodejno dodaja v vsebnik presenterje, vendar je mogoče enostavno dodajati tudi katere koli druge razrede.

Zadostuje navesti, v katerih mapah (in podmapah) naj išče razrede:

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

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

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

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

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

Ali pa lahko izberemo razrede, ki dedujejo ali implementirajo vsaj enega od navedenih razredov:


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

Lahko definiramo tudi izključujoča pravila, tj. maske imena razreda ali dedne prednike, ki če ustrezajo, se storitev v DI vsebnik ne doda:

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

Vsem storitvam lahko nastavimo oznake:

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


Združevanje
===========

Če se v več konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru polj združeni. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja.

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

Pri poljih lahko preprečimo združevanje z navedbo klicaja za imenom ključa:

<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 Dependency Injection}}

Konfiguracija DI vsebnika

Pregled konfiguracijskih možnosti za Nette DI vsebnik.

Konfiguracijska datoteka

Nette DI vsebnik se enostavno upravlja s konfiguracijskimi datotekami. Te se običajno zapisujejo v formatu NEON. Za urejanje priporočamo urejevalnike s podporo za ta format.

 decorator: 	Dekorator
di: DI vsebnik
extensions: Namestitev dodatnih DI razširitev
includes: Vključevanje datotek
parameters: Parametri
search: Samodejna registracija storitev
services: Storitve

Če želite zapisati niz, ki vsebuje znak %, ga morate ubežati z podvojitvijo na %%.

Parametri

V konfiguraciji lahko definirate parametre, ki jih lahko nato uporabite kot del definicij storitev. S tem lahko naredite konfiguracijo preglednejšo ali združite in izločite vrednosti, ki se bodo spreminjale.

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

Na parameter dsn se sklicujemo kjerkoli v konfiguraciji z zapisom %dsn%. Parametre lahko uporabljamo tudi znotraj nizov kot '%wwwDir%/images'.

Parametri niso nujno samo nizi ali števila, lahko vsebujejo tudi polja:

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

Na določen ključ se sklicujemo kot %mailer.user%.

Če potrebujete v vaši kodi, na primer v razredu, ugotoviti vrednost katerega koli parametra, ga posredujte v ta razred. Na primer v konstruktorju. Ne obstaja noben globalni objekt, ki bi predstavljal konfiguracijo, katerega bi razredi spraševali za vrednosti parametrov. To bi bilo kršenje načela dependency injection.

Storitve

Glej samostojno poglavje.

Decorator

Kako množično urediti vse storitve določenega tipa? Na primer poklicati določeno metodo pri vseh presenterjih, ki dedujejo od določenega skupnega prednika? Za to je tu decorator.

decorator:
	# pri vseh storitvah, ki so instanca tega razreda ali vmesnika
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # pokliči to metodo
			- $absoluteUrls = true   # in nastavi spremenljivko

Decorator se lahko uporablja tudi za nastavitev oznak ali vklop načina inject.

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

DI

Tehnične nastavitve DI vsebnika.

di:
	# prikazati DIC v Tracy Bar?
	debugger: ...        # (bool) privzeto je true

	# tipi parametrov, ki jih nikoli ne avtomatsko povezovati
	excluded: ...        # (string[])

	# dovoliti leno ustvarjanje storitev?
	lazy: ...            # (bool) privzeto je false

	# razred, od katerega deduje DI vsebnik
	parentClass: ...     # (string) privzeto je Nette\DI\Container

Lene storitve

Nastavitev lazy: true aktivira leno (odloženo) ustvarjanje storitev. To pomeni, da storitve niso dejansko ustvarjene v trenutku, ko jih zahtevamo iz DI vsebnika, ampak šele v trenutku njihove prve uporabe. To lahko pospeši zagon aplikacije in zmanjša pomnilniške zahteve, saj se ustvarijo samo tiste storitve, ki so v danem zahtevku dejansko potrebne.

Pri določeni storitvi lahko leno ustvarjanje spremenimo.

Lene objekte je mogoče uporabiti samo za uporabniške razrede, ne pa za interne PHP razrede. Zahteva PHP 8.4 ali novejšo različico.

Izvoz metapodatkov

Razred DI vsebnika vsebuje tudi veliko metapodatkov. Lahko ga zmanjšate tako, da zmanjšate izvoz metapodatkov.

di:
	export:
		# izvoziti parametre?
		parameters: false   # (bool) privzeto je true

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

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

Če ne uporabljate polja $container->getParameters(), lahko izklopite izvoz parametrov. Nadalje lahko izvozite samo tiste oznake, prek katerih pridobivate storitve z metodo $container->findByTag(...). Če metode sploh ne kličete, lahko popolnoma izklopite izvoz oznak z false.

Znatno lahko zmanjšate metapodatke za samodejnim povezovanjem tako, da navedete razrede, ki jih uporabljate kot parameter metode $container->getByType(). In spet, če metode sploh ne kličete (oz. samo v bootstrapu za pridobitev Nette\Application\Application), lahko izvoz popolnoma izklopite z false.

Razširitve

Registracija dodatnih DI razširitev. Na ta način dodamo npr. DI razširitev Dibi\Bridges\Nette\DibiExtension22 pod imenom dibi

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Nato jo torej konfiguriramo v sekciji dibi:

dibi:
	host: localhost

Kot razširitev lahko dodamo tudi razred, ki ima parametre:

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

Vključevanje datotek

Druge konfiguracijske datoteke lahko vključimo v sekciji includes:

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

Ime parameters.php ni napaka, konfiguracija je lahko zapisana tudi v PHP datoteki, ki jo vrne kot polje:

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

Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru polj združeni. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja. Datoteka, v kateri je navedena sekcija includes, ima višjo prioriteto kot v njej vključene datoteke.

Iskanje

Samodejno dodajanje storitev v DI vsebnik izjemno olajša delo. Nette samodejno dodaja v vsebnik presenterje, vendar je mogoče enostavno dodajati tudi katere koli druge razrede.

Zadostuje navesti, v katerih mapah (in podmapah) naj išče razrede:

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

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

search:
	-	in: %appDir%/Forms

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

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

Ali pa lahko izberemo razrede, ki dedujejo ali implementirajo vsaj enega od navedenih razredov:

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

Lahko definiramo tudi izključujoča pravila, tj. maske imena razreda ali dedne prednike, ki če ustrezajo, se storitev v DI vsebnik ne doda:

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

Vsem storitvam lahko nastavimo oznake:

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

Združevanje

Če se v več konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru polj združeni. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja.

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

Pri poljih lahko preprečimo združevanje z navedbo klicaja za imenom ključa:

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