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.
Ricerca
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 |
---|---|---|
|
|
|
Per impedire l'unione di un determinato array, utilizzare il punto esclamativo subito dopo il nome dell'array:
config1.neon | config2.neon | risultato |
---|---|---|
|
|
|