Configurazione del contenitore DI

Panoramica delle opzioni di configurazione del contenitore Nette DI.

File di configurazione

Il contenitore Nette DI può essere controllato facilmente tramite file di configurazione. Di solito sono scritti in formato NEON. Per la modifica si consiglia di utilizzare editor che supportino questo formato.

 decorator: 	Decoratore
di: Contenitore DI
extensions: Installa estensioni DI aggiuntive
includes: File di inclusione
parameters: Parametri
search: Registrazione automatica dei servizi
services: Servizi

Per scrivere una stringa contenente il carattere %, you must escape it by doubling it to %%.

Parametri

È possibile definire dei parametri che possono essere utilizzati come parte delle definizioni dei servizi. Questo può aiutare a separare i valori che si desidera modificare più regolarmente.

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

È possibile fare riferimento al parametro foo tramite %foo% in qualsiasi altro punto del file di configurazione. Possono anche essere usati all'interno di stringhe come '%wwwDir%/images'.

Non è necessario che i parametri siano solo stringhe, possono anche essere valori di array:

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

Si può fare riferimento a una singola chiave come %mailer.user%.

Se è necessario ottenere il valore di un parametro nel codice, ad esempio nella classe, passarlo a questa classe. Per esempio, nel costruttore. Non esiste un oggetto di configurazione globale che possa essere interrogato dalle classi per ottenere i valori dei parametri. Ciò sarebbe contrario al principio dell'iniezione di dipendenza.

Servizi

Si veda il capitolo separato.

Decoratore

Come modificare in blocco tutti i servizi di un certo tipo? È necessario chiamare un certo metodo per tutti i presentatori che ereditano da un particolare antenato comune? Ecco dove nasce il decoratore.

decorator:
	# per tutti i servizi che sono istanze di questa classe o interfaccia
	App\UI\BasePresenter:
		setup:
			- setProjectId(10)     # chiama questo metodo
			- $absoluteUrls = true # e imposta la variabile

Il decoratore può essere usato anche per impostare i tag o attivare la modalità inject.

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

DI

Impostazioni tecniche del contenitore DI.

di:
	# mostra il DIC nella barra Tracy?
	debugger: ...        # (bool) predefinito a true

	# tipi di parametri che non devono mai essere autocablati
	excluded: ...        # (string[])

	# la classe da cui eredita il contenitore DI
	parentClass: ...     # (string) predefinita a Nette\DI\Container

Esportazione di metadati

Anche la classe contenitore DI contiene molti metadati. È possibile ridurli riducendo l'esportazione dei metadati.

di:
	export:
		# per esportare i parametri?
		parameters: false   # (bool) predefinito a true

		# esportare i tag e quali?
		tags:                # (string[]|bool) il valore predefinito è tutti
			- event.subscriber

		# esporta i dati per il cablaggio automatico e quali?
		types:              # (string[]|bool) il valore predefinito è all
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Se non si usa l'array $container->getParameters(), si può disabilitare l'esportazione dei parametri. Inoltre, si possono esportare solo i tag attraverso i quali si ottengono servizi con il metodo $container->findByTag(...). Se non si chiama affatto il metodo, si può disabilitare completamente l'esportazione dei tag con false.

È possibile ridurre in modo significativo i metadati per il cablaggio automatico, specificando le classi utilizzate come parametro del metodo $container->getByType(). E ancora, se non si chiama affatto il metodo (o solo in bootstrap per ottenere Nette\Application\Application), si può disabilitare completamente l'esportazione con false.

Estensioni

Registrazione di altre estensioni DI. In questo modo si aggiunge, ad esempio, l'estensione DI Dibi\Bridges\Nette\DibiExtension22 con il nome dibi:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Poi la configuriamo nella sua sezione chiamata anche dibi:

dibi:
	host: localhost

Si può anche aggiungere una classe di estensione con parametri:

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

Includere i file

È possibile inserire file di configurazione aggiuntivi nella sezione includes:

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

Il nome parameters.php non è un refuso, la configurazione può essere scritta anche in un file PHP, che la restituisce come array:

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

Se all'interno dei file di configurazione compaiono elementi con le stesse chiavi, questi verranno sovrascritti o uniti nel caso di array. Il file incluso successivamente ha una priorità maggiore rispetto al precedente. Il file in cui è elencata la sezione includes ha una priorità maggiore rispetto ai file inclusi in esso.

L'aggiunta automatica di servizi al contenitore DI rende il lavoro estremamente piacevole. Nette aggiunge automaticamente i presentatori al contenitore, ma è possibile aggiungere facilmente qualsiasi altra classe.

Basta specificare in quali directory (e sottodirectory) devono essere cercate le classi:

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

Di solito, però, non vogliamo aggiungere tutte le classi e le interfacce, quindi possiamo filtrarle:

search:
	-	in: %appDir%/Forms

		# filtrare per nome di file (string|string[])
		files:
			- *Factory.php

		# filtrare per nome di classe (string|string[])
		classes:
			- *Factory

Oppure possiamo selezionare le classi che ereditano o implementano almeno una delle seguenti classi:

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

Si possono anche definire regole negative, cioè maschere di nomi di classi o antenati e, se sono conformi, il servizio non sarà aggiunto al contenitore DI:

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

I tag possono essere impostati per i servizi aggiunti:

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

Fusione

Se elementi con le stesse chiavi appaiono in più file di configurazione, questi verranno sovrascritti o uniti nel caso di array. Il file incluso più tardi ha una priorità maggiore.

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

Per impedire l'unione di un determinato array, utilizzare il punto esclamativo subito dopo il nome dell'array:

config1.neon config2.neon risultato
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versione: 3.x