DI-Container konfigurieren

Überblick über die Konfigurationsmöglichkeiten für den Nette-DI-Container.

Konfigurationsdatei

Der Nette-DI-Container lässt sich leicht über Konfigurationsdateien steuern. Sie sind normalerweise im NEON-Format geschrieben. Wir empfehlen, für die Bearbeitung Editoren zu verwenden , die dieses Format unterstützen.

 decorator: 	Dekorateur
di: DI-Container
extensions: Zusätzliche DI-Erweiterungen installieren
includes: Einschließlich Dateien
parameters: Parameter
search: Automatische Registrierung von Diensten
services: Dienstleistungen

So schreiben Sie eine Zeichenfolge, die das Zeichen %, you must escape it by doubling it to %% enthält.

Parameter

Sie können Parameter definieren, die dann als Teil von Dienstdefinitionen verwendet werden können. Auf diese Weise können Sie Werte, die Sie häufiger ändern möchten, besser herausfiltern.

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

Sie können auf den Parameter foo über %foo% an anderer Stelle in jeder Konfigurationsdatei verweisen. Sie können auch innerhalb von Zeichenketten wie '%wwwDir%/images' verwendet werden.

Parameter müssen nicht nur Strings sein, sie können auch Array-Werte sein:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Sie können sich auf einzelne Schlüssel als %mailer.user% beziehen.

Wenn Sie den Wert eines Parameters in Ihrem Code benötigen, z. B. in Ihrer Klasse, dann übergeben Sie ihn an diese Klasse. Zum Beispiel im Konstruktor. Es gibt kein globales Konfigurationsobjekt, das Klassen nach Parameterwerten abfragen können. Dies würde gegen das Prinzip der Dependency Injection verstoßen.

Dienste

Siehe separates Kapitel.

Dekorateur

Wie kann man alle Dienste eines bestimmten Typs als Ganzes bearbeiten? Müssen Sie eine bestimmte Methode für alle Präsentatoren aufrufen, die von einem bestimmten gemeinsamen Vorfahren erben? Genau dafür gibt es den Decorator.

decorator:
	# für alle Dienste, die Instanzen dieser Klasse oder Schnittstelle sind
	App\Presenters\BasePresenter:
		setup:
			- setProjectId(10)     # diese Methode aufrufen
			- $absoluteUrls = true # und setze die Variable

Decorator kann auch verwendet werden, um Tags zu setzen oder den Inject-Modus zu aktivieren.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

Technische Einstellungen des DI-Containers.

di:
	# zeigt DIC in Tracy Bar?
	debugger: ...        # (bool) standardmäßig true

	# Parametertypen, die Sie niemals automatisch verdrahten
	excluded: ...        # (string[])

	# die Klasse, von der der DI-Container erbt
	parentClass: ...     # (string) ist standardmäßig Nette\DI\Container

Metadaten-Export

Die DI-Containerklasse enthält auch eine Menge Metadaten. Sie können diese reduzieren, indem Sie den Metadatenexport verringern.

di:
	export:
		# Parameter zu exportieren?
		parameters: false   # (bool) ist standardmäßig auf true eingestellt

		# Tags exportieren und welche?
		tags:               # (string[]|bool) der Standard ist all
			- event.subscriber

		# exportiere Daten für Autowiring und welche?
		types:              # (string[]|bool) die Voreinstellung ist all
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Wenn Sie das Array $container->getParameters() nicht verwenden, können Sie den Export der Parameter deaktivieren. Außerdem können Sie nur die Tags exportieren, über die Sie mit der Methode $container->findByTag(...) Dienste erhalten. Wenn Sie die Methode gar nicht aufrufen, können Sie den Tag-Export mit false vollständig deaktivieren.

Sie können die Metadaten für die automatische Verdrahtung erheblich reduzieren, indem Sie die von Ihnen verwendeten Klassen als Parameter für die Methode $container->getByType() angeben. Und wenn Sie die Methode gar nicht aufrufen (oder nur in bootstrap, um Nette\Application\Application zu erhalten), können Sie den Export mit false vollständig deaktivieren.

Erweiterungen

Registrierung von anderen DI-Erweiterungen. Auf diese Weise fügen wir z.B. die DI-Erweiterung Dibi\Bridges\Nette\DibiExtension22 unter dem Namen dibi hinzu:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Dann konfigurieren wir sie in ihrem Abschnitt, der auch dibi heißt:

dibi:
	host: localhost

Sie können auch eine Erweiterungsklasse mit Parametern hinzufügen:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)

Dateien einschließen

Zusätzliche Konfigurationsdateien können im Abschnitt includes eingefügt werden:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

Der Name parameters.php ist kein Tippfehler, die Konfiguration kann auch in eine PHP-Datei geschrieben werden, die sie als Array zurückgibt:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Wenn Elemente mit denselben Schlüsseln in Konfigurationsdateien vorkommen, werden sie überschrieben oder im Falle von Arrays zusammengeführt. Die später eingefügte Datei hat eine höhere Priorität als die vorherige. Die Datei, in der der Abschnitt includes aufgeführt ist, hat eine höhere Priorität als die darin enthaltenen Dateien.

Das automatische Hinzufügen von Diensten zum DI-Container macht die Arbeit sehr angenehm. Nette fügt automatisch Presenter in den Container ein, aber Sie können auch ganz einfach andere Klassen hinzufügen.

Geben Sie einfach an, in welchen Verzeichnissen (und Unterverzeichnissen) nach den Klassen gesucht werden soll:

Suche:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

Normalerweise wollen wir jedoch nicht alle Klassen und Schnittstellen hinzufügen, so dass wir sie filtern können:

search:
	-	in: %appDir%/Forms

		# Filtern nach Dateinamen (string|string[])
		files:
			- *Factory.php

		# Filtern nach Klassennamen (string|string[])
		classes:
			- *Fabrik

Oder wir können Klassen auswählen, die mindestens eine der folgenden Klassen erben oder implementieren:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

Sie können auch negative Regeln definieren, z. B. Klassennamensmasken oder Vorfahren, und wenn sie diese erfüllen, wird der Dienst nicht zum DI-Container hinzugefügt:

search:
	-	in: %appDir%
		exclude:
Dateien: ...
			classes: ...
			extends: ...
			implements: ...

Für hinzugefügte Dienste können Tags gesetzt werden:

search:
	-	in: %appDir%
		tags: ...

Zusammenführung

Wenn Elemente mit denselben Schlüsseln in mehreren Konfigurationsdateien vorkommen, werden sie überschrieben oder im Falle von Arrays zusammengeführt. Die später hinzugefügte Datei hat eine höhere Priorität.

config1.neon config2.neon Ergebnis
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Um das Zusammenführen eines bestimmten Arrays zu verhindern, verwenden Sie ein Ausrufezeichen direkt nach dem Namen des Arrays:

config1.neon Konfig2.neon Ergebnis
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
Version: 3.x