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\Presenters\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.

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
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

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
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
version: 3.x