Nette Documentation Preview

syntax
Laden der Konfigurationsdatei
*****************************

.[perex]
Die einzelnen Komponenten von Nette werden über Konfigurationsdateien konfiguriert. Wir zeigen Ihnen, wie Sie diese Dateien laden können.

.[tip]
Wenn Sie das gesamte Framework verwenden, müssen Sie nichts weiter tun. Im Projekt gibt es ein vorgefertigtes Verzeichnis `config/` für die Konfigurationsdateien, und der [Application Loader |application:bootstrap#DI Container Configuration] ist für das Laden dieser Dateien verantwortlich.
Dieser Artikel richtet sich an Benutzer, die nur eine Nette-Bibliothek verwenden und die Vorteile der Konfigurationsdateien nutzen möchten.

Konfigurationsdateien sind normalerweise im [NEON|neon:format] geschrieben und werden am besten in [Editoren mit Unterstützung dafür|best-practices:editors-and-tools#ide-editor] bearbeitet. Man kann sie sich als Anweisungen vorstellen, wie man **Objekte erstellt und konfiguriert**. So wird das Ergebnis des Ladens einer Konfiguration eine so genannte Fabrik sein, ein Objekt, das bei Bedarf andere Objekte erzeugt, die Sie verwenden möchten. Zum Beispiel eine Datenbankverbindung, usw.

Diese Fabrik wird auch als *Dependency Injection Container* (DI-Container) bezeichnet. Wenn Sie an den Details interessiert sind, lesen Sie das Kapitel über [Dependency Injection |dependency-injection:].

Das Laden der Konfiguration und das Erstellen des Containers wird von der Klasse [api:Nette\Bootstrap\Configurator] erledigt, also installieren wir zuerst ihr Paket `nette/bootstrap`:

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

Und erstellen Sie eine Instanz der Klasse `Configurator`. Da der erzeugte DI-Container auf der Festplatte zwischengespeichert wird, müssen Sie den Pfad zu dem Verzeichnis angeben, in dem er gespeichert werden soll:

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

Unter Linux oder macOS setzen Sie die [Schreibrechte |nette:troubleshooting#Setting directory permissions] für das Verzeichnis `temp/`.

Nun kommen wir zu den Konfigurationsdateien selbst. Diese werden über `addConfig()` geladen:

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

Wenn Sie weitere Konfigurationsdateien hinzufügen möchten, können Sie die Funktion `addConfig()` mehrfach aufrufen. Wenn in den Dateien Elemente mit denselben Schlüsseln vorkommen, werden sie überschrieben (oder im Falle von Arrays [zusammengeführt |dependency-injection:configuration#Merging] ). Eine später eingefügte Datei hat eine höhere Priorität als die vorherige.

Der letzte Schritt besteht darin, einen DI-Container zu erstellen:

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

Dieser wird bereits die gewünschten Objekte für uns erstellen. Wenn Sie zum Beispiel die Konfiguration für [Nette Database |database:configuration] verwenden, können Sie ihn bitten, Datenbankverbindungen zu erstellen:

```php
$db = $container->getByType(Nette\Database\Connection::class);
// oder
$explorer = $container->getByType(Nette\Database\Explorer::class);
// oder beim Erstellen mehrerer Verbindungen
$db = $container->getByName('database.main.connection');
```

Und schon können Sie mit der Datenbank arbeiten!


Entwicklungs- vs. Produktionsmodus .[#toc-development-vs-production-mode]
-------------------------------------------------------------------------

Im Entwicklungsmodus wird der Container automatisch aktualisiert, wenn die Konfigurationsdateien geändert werden. Im Produktionsmodus wird er nur einmal erstellt und Änderungen werden nicht überprüft.
Der Entwicklermodus zielt also auf maximale Bequemlichkeit für den Programmierer ab, während der Produktionsmodus auf Leistung ausgerichtet ist.

Die Auswahl des Modus erfolgt durch automatische Erkennung, so dass es in der Regel nicht notwendig ist, etwas zu konfigurieren oder manuell umzuschalten. Der Entwicklungsmodus ist aktiviert, wenn die Anwendung auf einem lokalen Host (d. h. IP-Adresse `127.0.0.1` oder `::1`) läuft und kein Proxy (d. h. sein HTTP-Header) vorhanden ist. Ansonsten läuft sie im Produktionsmodus.

Wenn Sie den Entwicklungsmodus in anderen Fällen aktivieren möchten, z. B. für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, verwenden Sie `setDebugMode()`:

```php
$configurator->setDebugMode('23.75.345.200');
// es kann auch ein Array von IP-Adressen angegeben werden
```

Wir empfehlen unbedingt, die IP-Adresse mit einem Cookie zu kombinieren. Speichern Sie ein geheimes Token, z. B. `secret1234`, im Cookie `nette-debug`. Auf diese Weise aktivieren Sie den Entwicklungsmodus für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, und haben auch das im Cookie erwähnte Token:

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

Sie können den Entwicklermodus auch ganz deaktivieren, sogar für localhost:

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


Parameter .[#toc-parameters]
----------------------------

Sie können auch Parameter in Konfigurationsdateien verwenden, die [im Abschnitt `parameters`  |dependency-injection:configuration#parameters`] definiert sind.

Sie können auch von außen mit der Methode `addDynamicParameters()` eingefügt werden:

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

Der Parameter `projectId` kann in der Konfiguration mit der Notation `%projectId%` referenziert werden.


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

Laden der Konfigurationsdatei

Die einzelnen Komponenten von Nette werden über Konfigurationsdateien konfiguriert. Wir zeigen Ihnen, wie Sie diese Dateien laden können.

Wenn Sie das gesamte Framework verwenden, müssen Sie nichts weiter tun. Im Projekt gibt es ein vorgefertigtes Verzeichnis config/ für die Konfigurationsdateien, und der Application Loader ist für das Laden dieser Dateien verantwortlich. Dieser Artikel richtet sich an Benutzer, die nur eine Nette-Bibliothek verwenden und die Vorteile der Konfigurationsdateien nutzen möchten.

Konfigurationsdateien sind normalerweise im NEON geschrieben und werden am besten in Editoren mit Unterstützung dafür bearbeitet. Man kann sie sich als Anweisungen vorstellen, wie man Objekte erstellt und konfiguriert. So wird das Ergebnis des Ladens einer Konfiguration eine so genannte Fabrik sein, ein Objekt, das bei Bedarf andere Objekte erzeugt, die Sie verwenden möchten. Zum Beispiel eine Datenbankverbindung, usw.

Diese Fabrik wird auch als Dependency Injection Container (DI-Container) bezeichnet. Wenn Sie an den Details interessiert sind, lesen Sie das Kapitel über Dependency Injection.

Das Laden der Konfiguration und das Erstellen des Containers wird von der Klasse Nette\Bootstrap\Configurator erledigt, also installieren wir zuerst ihr Paket nette/bootstrap:

composer require nette/bootstrap

Und erstellen Sie eine Instanz der Klasse Configurator. Da der erzeugte DI-Container auf der Festplatte zwischengespeichert wird, müssen Sie den Pfad zu dem Verzeichnis angeben, in dem er gespeichert werden soll:

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

Unter Linux oder macOS setzen Sie die Schreibrechte für das Verzeichnis temp/.

Nun kommen wir zu den Konfigurationsdateien selbst. Diese werden über addConfig() geladen:

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

Wenn Sie weitere Konfigurationsdateien hinzufügen möchten, können Sie die Funktion addConfig() mehrfach aufrufen. Wenn in den Dateien Elemente mit denselben Schlüsseln vorkommen, werden sie überschrieben (oder im Falle von Arrays zusammengeführt ). Eine später eingefügte Datei hat eine höhere Priorität als die vorherige.

Der letzte Schritt besteht darin, einen DI-Container zu erstellen:

$container = $configurator->createContainer();

Dieser wird bereits die gewünschten Objekte für uns erstellen. Wenn Sie zum Beispiel die Konfiguration für Nette Database verwenden, können Sie ihn bitten, Datenbankverbindungen zu erstellen:

$db = $container->getByType(Nette\Database\Connection::class);
// oder
$explorer = $container->getByType(Nette\Database\Explorer::class);
// oder beim Erstellen mehrerer Verbindungen
$db = $container->getByName('database.main.connection');

Und schon können Sie mit der Datenbank arbeiten!

Entwicklungs- vs. Produktionsmodus

Im Entwicklungsmodus wird der Container automatisch aktualisiert, wenn die Konfigurationsdateien geändert werden. Im Produktionsmodus wird er nur einmal erstellt und Änderungen werden nicht überprüft. Der Entwicklermodus zielt also auf maximale Bequemlichkeit für den Programmierer ab, während der Produktionsmodus auf Leistung ausgerichtet ist.

Die Auswahl des Modus erfolgt durch automatische Erkennung, so dass es in der Regel nicht notwendig ist, etwas zu konfigurieren oder manuell umzuschalten. Der Entwicklungsmodus ist aktiviert, wenn die Anwendung auf einem lokalen Host (d. h. IP-Adresse 127.0.0.1 oder ::1) läuft und kein Proxy (d. h. sein HTTP-Header) vorhanden ist. Ansonsten läuft sie im Produktionsmodus.

Wenn Sie den Entwicklungsmodus in anderen Fällen aktivieren möchten, z. B. für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, verwenden Sie setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// es kann auch ein Array von IP-Adressen angegeben werden

Wir empfehlen unbedingt, die IP-Adresse mit einem Cookie zu kombinieren. Speichern Sie ein geheimes Token, z. B. secret1234, im Cookie nette-debug. Auf diese Weise aktivieren Sie den Entwicklungsmodus für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, und haben auch das im Cookie erwähnte Token:

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

Sie können den Entwicklermodus auch ganz deaktivieren, sogar für localhost:

$configurator->setDebugMode(false);

Parameter

Sie können auch Parameter in Konfigurationsdateien verwenden, die im Abschnitt parameters definiert sind.

Sie können auch von außen mit der Methode addDynamicParameters() eingefügt werden:

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

Der Parameter projectId kann in der Konfiguration mit der Notation %projectId% referenziert werden.