Configuration du conteneur DI
Aperçu des options de configuration du conteneur DI de Nette.
Fichier de configuration
Le conteneur Nette DI est facile à contrôler à l'aide de fichiers de configuration. Ceux-ci sont généralement écrits au format NEON. Nous recommandons d'utiliser des éditeurs prenant en charge ce format pour les éditer.
decorator: Décorateur
di: Conteneur DI
extensions: Installer des extensions DI supplémentaires
includes: Incluant les fichiers
parameters: Paramètres
search: Enregistrement automatique des services
services: Services
Pour écrire une chaîne contenant le caractère %
, you must escape it by doubling it to
%%
.
Paramètres
Vous pouvez définir des paramètres qui peuvent ensuite être utilisés dans le cadre de définitions de services. Cela peut permettre de séparer les valeurs que vous souhaitez modifier plus régulièrement.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Vous pouvez faire référence au paramètre foo
via %foo%
ailleurs dans n'importe quel fichier de
configuration. Ils peuvent également être utilisés à l'intérieur de chaînes de caractères comme
'%wwwDir%/images'
.
Les paramètres ne doivent pas nécessairement être des chaînes de caractères, ils peuvent également être des tableaux de valeurs :
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Vous pouvez vous référer à une seule clé comme %mailer.user%
.
Si vous avez besoin d'obtenir la valeur d'un paramètre dans votre code, par exemple dans votre classe, alors passez-le à cette classe. Par exemple, dans le constructeur. Il n'y a pas d'objet de configuration global que les classes peuvent interroger pour connaître les valeurs des paramètres. Cela irait à l'encontre du principe d'injection de dépendances.
Services
Voir le chapitre séparé.
Décorateur
Comment modifier en masse tous les services d'un certain type ? Vous avez besoin d'appeler une certaine méthode pour tous les présentateurs héritant d'un ancêtre commun particulier ? C'est là qu'intervient le décorateur.
decorator:
# pour tous les services qui sont des instances de cette classe ou interface
App\UI\BasePresenter:
setup:
- setProjectId(10) # appelle cette méthode
- $absoluteUrls = true # et définir la variable
Le décorateur peut également être utilisé pour définir des balises ou activer le mode injection.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
Paramètres techniques du conteneur DI.
di:
# montre le DIC dans la barre de Tracy ?
debugger: ... # (bool) par défaut à true
# types de paramètres que l'on ne peut jamais câbler automatiquement
excluded: ... # (string[])
# la classe dont hérite le conteneur DI
parentClass: ... # (string) a pour valeur par défaut Nette\DI\Container
Exportation de métadonnées
La classe conteneur DI contient également beaucoup de métadonnées. Vous pouvez les réduire en réduisant l'exportation de métadonnées.
di:
export:
# pour exporter les paramètres ?
parameters: false # (bool) par défaut à true
# exporter les balises et lesquelles ?
tags: # (string[]|bool) la valeur par défaut est all
- event.subscriber
# exporter les données pour le câblage automatique et lesquelles ?
types: # (string[]|bool) la valeur par défaut est all
- Nette\Database\Connection
- Symfony\Component\Console\Application
Si vous n'utilisez pas le tableau $container->getParameters()
, vous pouvez désactiver l'exportation des
paramètres. En outre, vous pouvez exporter uniquement les balises par lesquelles vous obtenez des services en utilisant la
méthode $container->findByTag(...)
. Si vous n'appelez pas du tout la méthode, vous pouvez désactiver
complètement l'exportation des balises avec false
.
Vous pouvez réduire considérablement les métadonnées pour le câblage automatique en spécifiant les classes que vous
utilisez comme paramètre de la méthode $container->getByType()
. Et encore une fois, si vous n'appelez pas du
tout la méthode (ou seulement dans bootstrap pour obtenir
Nette\Application\Application
), vous pouvez désactiver entièrement l'exportation avec false
.
Extensions
Enregistrement d'autres extensions DI. De cette façon, nous ajoutons, par exemple, l'extension DI
Dibi\Bridges\Nette\DibiExtension22
sous le nom dibi
:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Puis nous la configurons dans sa section appelée également dibi
:
dibi:
host: localhost
Vous pouvez également ajouter une classe d'extension avec des paramètres :
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Inclure des fichiers
Des fichiers de configuration supplémentaires peuvent être insérés dans la section includes
:
includes:
- parameters.php
- services.neon
- presenters.neon
Le nom parameters.php
n'est pas une faute de frappe, la configuration peut également être écrite dans un
fichier PHP, qui la renvoie sous forme de tableau :
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Si des éléments avec les mêmes clés apparaissent dans les fichiers de configuration, ils seront écrasés ou fusionnés dans le cas des tableaux. Le fichier inclus le plus tard a une priorité plus
élevée que le précédent. Le fichier dans lequel figure la section includes
a une priorité plus élevée que les
fichiers qui y sont inclus.
Recherche
L'ajout automatique de services au conteneur DI rend le travail extrêmement agréable. Nette ajoute automatiquement les présentateurs au conteneur, mais vous pouvez facilement ajouter toute autre classe.
Il suffit de préciser dans quels répertoires (et sous-répertoires) les classes doivent être recherchées :
recherche:
- in: %appDir%/Forms
- in: %appDir%/Model
En général, cependant, nous ne voulons pas ajouter toutes les classes et interfaces, nous pouvons donc les filtrer :
recherche:
- in: %appDir%/Forms
# filtrer par nom de fichier (string|string[])
files:
- *Factory.php
# filtrage par nom de classe (string|string[])
classes:
- *Factory
Ou nous pouvons sélectionner les classes qui héritent ou implémentent au moins une des classes suivantes :
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Vous pouvez également définir des règles négatives, c'est-à-dire des masques de noms de classes ou d'ancêtres et s'ils sont conformes, le service ne sera pas ajouté au conteneur DI :
search:
- in: %appDir%
exclude:
fichiers : ...
classes: ...
extends: ...
implements: ...
Des étiquettes peuvent être définies pour les services ajoutés :
search:
- in: %appDir%
tags: ...
Fusionner
Si des éléments ayant les mêmes clés apparaissent dans plusieurs fichiers de configuration, ils seront écrasés ou fusionnés dans le cas de tableaux. Le fichier inclus le plus tard a une priorité plus élevée.
config1.neon | config2.neon | résultat |
---|---|---|
|
|
|
Pour empêcher la fusion d'un certain tableau, utilisez le point d'exclamation juste après le nom du tableau :
config1.neon | config2.neon | résultat |
---|---|---|
|
|
|