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.
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:
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 kann auch verwendet werden, um Tags zu setzen oder den Inject-Modus zu aktivieren.
DI
Technische Einstellungen des DI-Containers.
Faule Dienstleistungen
Die Einstellung lazy: true
ermöglicht die faule (verzögerte) Erstellung von Diensten. Dies bedeutet, dass die
Dienste nicht bei der Anforderung des DI-Containers, sondern erst bei ihrer ersten Verwendung erstellt werden. Dies kann den Start
der Anwendung beschleunigen und die Speichernutzung reduzieren, da nur die für eine bestimmte Anforderung erforderlichen Dienste
erstellt werden.
Für einen bestimmten Dienst kann die verzögerte Erstellung angepasst werden.
Lazy Objects können nur für benutzerdefinierte Klassen verwendet werden, nicht für interne PHP-Klassen. Erfordert PHP 8.4 oder neuer.
Metadaten-Export
Die DI-Containerklasse enthält auch eine Menge Metadaten. Sie können diese reduzieren, indem Sie den Metadatenexport verringern.
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:
Dann konfigurieren wir sie in ihrem Abschnitt, der auch dibi
heißt:
Sie können auch eine Erweiterungsklasse mit Parametern hinzufügen:
Dateien einschließen
Zusätzliche Konfigurationsdateien können im Abschnitt includes
eingefügt werden:
Der Name parameters.php
ist kein Tippfehler, die Konfiguration kann auch in eine PHP-Datei geschrieben werden, die
sie als Array zurückgibt:
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.
Suche
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:
Normalerweise wollen wir jedoch nicht alle Klassen und Schnittstellen hinzufügen, so dass wir sie filtern können:
Oder wir können Klassen auswählen, die mindestens eine der folgenden Klassen erben oder implementieren:
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:
Für hinzugefügte Dienste können Tags gesetzt werden:
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 |
---|---|---|
Um das Zusammenführen eines bestimmten Arrays zu verhindern, verwenden Sie ein Ausrufezeichen direkt nach dem Namen des Arrays:
config1.neon | Konfig2.neon | Ergebnis |
---|---|---|