Nette Documentation Preview

syntax
Comment charger le fichier de configuration
*******************************************

.[perex]
Les différents composants de Nette sont configurés à l'aide de fichiers de configuration. Nous allons montrer comment charger ces fichiers.

.[tip]
Si vous utilisez l'ensemble du framework, il n'y a rien d'autre à faire. Dans le projet, vous avez un répertoire préparé à l'avance `config/` pour les fichiers de configuration, et le [chargeur d'application |application:bootstrap#DI Container Configuration] est responsable de leur chargement.
Cet article est destiné aux utilisateurs qui n'utilisent qu'une seule bibliothèque Nette et qui souhaitent tirer parti des fichiers de configuration.

Les fichiers de configuration sont généralement écrits en [NEON |neon:format] et il est préférable de les éditer dans des [éditeurs qui le supportent |best-practices:editors-and-tools#ide-editor]. Ils peuvent être considérés comme des instructions sur la façon de **créer et configurer** des objets. Ainsi, le résultat du chargement d'une configuration sera ce que l'on appelle une fabrique, c'est-à-dire un objet qui créera à la demande d'autres objets que vous souhaitez utiliser. Par exemple, une connexion à une base de données, etc.

Cette fabrique est également appelée un *conteneur d'injection de dépendances* (conteneur DI) et si vous êtes intéressé par les détails, lisez le chapitre sur l'[injection de dépendances |dependency-injection:].

Le chargement de la configuration et la création du conteneur sont gérés par la classe [api:Nette\Bootstrap\Configurator], nous allons donc d'abord installer son paquetage `nette/bootstrap`:

```shell
composer require nette/bootstrap
```

Et créer une instance de la classe `Configurator`. Comme le conteneur DI généré sera mis en cache sur le disque, vous devez définir le chemin d'accès au répertoire où il sera enregistré :

```php
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
```

Sous Linux ou macOS, définissez les [droits d'écriture |nette:troubleshooting#Setting directory permissions] pour le répertoire `temp/`.

Et nous en arrivons aux fichiers de configuration eux-mêmes. Ils sont chargés à l'aide de `addConfig()`:

```php
$configurator->addConfig(__DIR__ . '/database.neon');
```

Si vous voulez ajouter d'autres fichiers de configuration, vous pouvez appeler la fonction `addConfig()` plusieurs fois. Si des éléments ayant les mêmes clés apparaissent dans les fichiers, ils seront écrasés (ou [fusionnés |dependency-injection:configuration#Merging] dans le cas de tableaux). Un fichier inséré ultérieurement a une priorité plus élevée que le précédent.

La dernière étape consiste à créer un conteneur DI :

```php
$container = $configurator->createContainer();
```

Et il va déjà créer les objets souhaités pour nous. Par exemple, si vous utilisez la configuration pour [Nette Database |database:configuration], vous pouvez lui demander de créer des connexions de base de données :

```php
$db = $container->getByType(Nette\Database\Connection::class);
// ou
$explorer = $container->getByType(Nette\Database\Explorer::class);
// ou lors de la création de connexions multiples
$db = $container->getByName('database.main.connection');
```

Et maintenant vous pouvez travailler avec la base de données !


Mode développement et mode production .[#toc-development-vs-production-mode]
----------------------------------------------------------------------------

En mode développement, le conteneur est automatiquement mis à jour chaque fois que les fichiers de configuration sont modifiés. En mode production, il est généré une seule fois et les modifications ne sont pas vérifiées.
Le mode développement vise donc à faciliter au maximum la tâche du programmeur, tandis que le mode production vise les performances.

La sélection du mode se fait par autodétection, il n'est donc généralement pas nécessaire de configurer ou de changer manuellement quoi que ce soit. Le mode développement est utilisé lorsque l'application est exécutée sur un hôte local (c'est-à-dire l'adresse IP `127.0.0.1` ou `::1`) et qu'aucun proxy (c'est-à-dire son en-tête HTTP) n'est présent. Sinon, elle s'exécute en mode production.

Si vous souhaitez activer le mode développement dans d'autres cas, comme les programmeurs accédant à partir d'une adresse IP spécifique, utilisez `setDebugMode()`:

```php
$configurator->setDebugMode('23.75.345.200');
// un tableau d'adresses IP peut également être spécifié
```

Nous recommandons vivement de combiner l'adresse IP avec un cookie. Stockez un jeton secret, par exemple `secret1234`, dans le cookie `nette-debug`, et de cette façon vous activez le mode de développement pour les programmeurs accédant à partir d'une adresse IP spécifique et ayant également le jeton mentionné dans le cookie :

```php
$configurator->setDebugMode('secret1234@23.75.345.200');
```

Vous pouvez également désactiver complètement le mode de développement, même pour localhost :

```php
$configurator->setDebugMode(false);
```


Paramètres .[#toc-parameters]
-----------------------------

Vous pouvez également utiliser des paramètres dans les fichiers de configuration, qui sont définis dans la [section `parameters`  |dependency-injection:configuration#parameters`].

Ils peuvent également être insérés de l'extérieur à l'aide de la méthode `addDynamicParameters()`:

```php
$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```

Le paramètre `projectId` peut être référencé dans la configuration avec la notation `%projectId%`.


{{leftbar: nette:@menu-topics}}

Comment charger le fichier de configuration

Les différents composants de Nette sont configurés à l'aide de fichiers de configuration. Nous allons montrer comment charger ces fichiers.

Si vous utilisez l'ensemble du framework, il n'y a rien d'autre à faire. Dans le projet, vous avez un répertoire préparé à l'avance config/ pour les fichiers de configuration, et le chargeur d'application est responsable de leur chargement. Cet article est destiné aux utilisateurs qui n'utilisent qu'une seule bibliothèque Nette et qui souhaitent tirer parti des fichiers de configuration.

Les fichiers de configuration sont généralement écrits en NEON et il est préférable de les éditer dans des éditeurs qui le supportent. Ils peuvent être considérés comme des instructions sur la façon de créer et configurer des objets. Ainsi, le résultat du chargement d'une configuration sera ce que l'on appelle une fabrique, c'est-à-dire un objet qui créera à la demande d'autres objets que vous souhaitez utiliser. Par exemple, une connexion à une base de données, etc.

Cette fabrique est également appelée un conteneur d'injection de dépendances (conteneur DI) et si vous êtes intéressé par les détails, lisez le chapitre sur l'injection de dépendances.

Le chargement de la configuration et la création du conteneur sont gérés par la classe Nette\Bootstrap\Configurator, nous allons donc d'abord installer son paquetage nette/bootstrap:

composer require nette/bootstrap

Et créer une instance de la classe Configurator. Comme le conteneur DI généré sera mis en cache sur le disque, vous devez définir le chemin d'accès au répertoire où il sera enregistré :

$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');

Sous Linux ou macOS, définissez les droits d'écriture pour le répertoire temp/.

Et nous en arrivons aux fichiers de configuration eux-mêmes. Ils sont chargés à l'aide de addConfig():

$configurator->addConfig(__DIR__ . '/database.neon');

Si vous voulez ajouter d'autres fichiers de configuration, vous pouvez appeler la fonction addConfig() plusieurs fois. Si des éléments ayant les mêmes clés apparaissent dans les fichiers, ils seront écrasés (ou fusionnés dans le cas de tableaux). Un fichier inséré ultérieurement a une priorité plus élevée que le précédent.

La dernière étape consiste à créer un conteneur DI :

$container = $configurator->createContainer();

Et il va déjà créer les objets souhaités pour nous. Par exemple, si vous utilisez la configuration pour Nette Database, vous pouvez lui demander de créer des connexions de base de données :

$db = $container->getByType(Nette\Database\Connection::class);
// ou
$explorer = $container->getByType(Nette\Database\Explorer::class);
// ou lors de la création de connexions multiples
$db = $container->getByName('database.main.connection');

Et maintenant vous pouvez travailler avec la base de données !

Mode développement et mode production

En mode développement, le conteneur est automatiquement mis à jour chaque fois que les fichiers de configuration sont modifiés. En mode production, il est généré une seule fois et les modifications ne sont pas vérifiées. Le mode développement vise donc à faciliter au maximum la tâche du programmeur, tandis que le mode production vise les performances.

La sélection du mode se fait par autodétection, il n'est donc généralement pas nécessaire de configurer ou de changer manuellement quoi que ce soit. Le mode développement est utilisé lorsque l'application est exécutée sur un hôte local (c'est-à-dire l'adresse IP 127.0.0.1 ou ::1) et qu'aucun proxy (c'est-à-dire son en-tête HTTP) n'est présent. Sinon, elle s'exécute en mode production.

Si vous souhaitez activer le mode développement dans d'autres cas, comme les programmeurs accédant à partir d'une adresse IP spécifique, utilisez setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// un tableau d'adresses IP peut également être spécifié

Nous recommandons vivement de combiner l'adresse IP avec un cookie. Stockez un jeton secret, par exemple secret1234, dans le cookie nette-debug, et de cette façon vous activez le mode de développement pour les programmeurs accédant à partir d'une adresse IP spécifique et ayant également le jeton mentionné dans le cookie :

$configurator->setDebugMode('secret1234@23.75.345.200');

Vous pouvez également désactiver complètement le mode de développement, même pour localhost :

$configurator->setDebugMode(false);

Paramètres

Vous pouvez également utiliser des paramètres dans les fichiers de configuration, qui sont définis dans la section parameters.

Ils peuvent également être insérés de l'extérieur à l'aide de la méthode addDynamicParameters():

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

Le paramètre projectId peut être référencé dans la configuration avec la notation %projectId%.