Nette ist ein Open-Source-Webanwendungs-Framework, das auf der PHP-Sprache basiert. Eine seiner Kernfunktionen ist der Inversion of Control (IoC)-Container, der es uns ermöglicht, Objekte zu verwalten und die Komponenten unserer Anwendung durch Abhängigkeitsinjektion zu entkoppeln.
In diesem Artikel tauchen wir tief in den IoC-Container des Nette Frameworks ein und erfahren, wie Sie ihn in Ihren Anwendungen verwenden können, um die Codequalität und Wartbarkeit zu verbessern.
Schritt 1: IoC-Container konfigurieren
Im Nette-Framework befindet sich die Konfigurationsdatei des IoC-Containers standardmäßig in app/config/config.neon. Wir müssen unsere Dienste in dieser Datei definieren und sie dann an anderer Stelle in der Anwendung referenzieren.
Hier ist ein einfaches Beispiel, das einen Dienst namens Logger definiert:
services:
logger: class: AppLogger
Hier definieren wir einen Dienst mit einer Klasse namens AppLogger. Es ist hier nicht erforderlich, es zu instanziieren, da der IoC-Container es bei Bedarf automatisch instanziiert. Wir müssen es nur im Service-Container definieren und können es verwenden.
Schritt 2: Auf den Dienst zugreifen
Es gibt zwei Möglichkeiten, auf den Dienst im IoC-Container zuzugreifen. Die erste Möglichkeit besteht darin, den Dienst wie folgt in den Konstruktor des Controllers einzufügen:
use NetteApplicationUIController;
class BeispielController erweitert Controller
{
private $logger; public function __construct(AppLogger $logger) { $this->logger = $logger; } public function renderDefault() { $this->logger->log('Hello, world!'); }
}
Hier haben wir ihn über den Konstruktor des Controller-Logger-Dienstes eingefügt. Wir können es wie normale Objekte verwenden.
Die zweite Möglichkeit besteht darin, die automatische Injektionsfunktion des Nette-Frameworks zu verwenden. Wir müssen den Dienst lediglich als Parameter des Konstruktors für die automatische Injektion markieren, und der Abhängigkeitsinjektionscontainer wird ihn automatisch injizieren. Dies kann auf folgende Weise erreicht werden:
use NetteApplicationUIController;
class BeispielController erweitert Controller
{
/** @var AppLogger @inject */ public $logger; public function renderDefault() { $this->logger->log('Hello, world!'); }
}
Hier haben wir die $logger-Eigenschaft vom Typ AppLogger markiert und das @Inject-Tag verwendet, um das Nette-Framework mitzuteilen um es einzuschließen Injektion.
Schritt 3: Tags verwenden
Manchmal müssen wir andere Dienste in den Konstruktor des Dienstes einfügen. Um dieses Problem zu lösen, bietet das Nette-Framework das Konzept von Tags. Ein Tag ist eine Zeichenfolge, die einen Dienst (oder eine Reihe von Diensten) darstellt. Wenn der IoC-Container ein Objekt instanziiert, überprüft er die Konstruktorparameter des Objekts und fügt, wenn die Parameter markiert sind, den durch die Markierung dargestellten Dienst ein.
Hier ist ein Beispiel, das zwei Dienste (Logger und Datenbank) definiert und Tags verwendet, um sie in das Calculator-Objekt einzufügen:
services:
logger: class: AppLogger database: class: AppDatabase calculator: class: AppCalculator arguments: - @logger - @database
Hier definieren wir drei Dienste: Logger, Datenbank und Rechner. Logger und Datenbank werden als normale Dienste deklariert und der Rechner verwendet Tags in Argumenten, um auf Logger- und Datenbankdienste zu verweisen. Beachten Sie, dass das Tag mit dem @-Symbol beginnt.
Wenn wir nun ein Calculator-Objekt instanziieren, fügt der IoC-Container automatisch die Logger- und Datenbankdienste ein und übergibt sie an den Konstruktor des Calculator-Objekts.
Zusammenfassung
In diesem Artikel haben wir uns eingehend mit dem IoC-Container des Nette-Frameworks befasst und gelernt, wie wir ihn in unseren Anwendungen verwenden können. Die Beherrschung der Grundkenntnisse von IoC-Containern kann uns helfen, besseren PHP-Code zu schreiben und die Codequalität und Wartbarkeit zu verbessern. Ich hoffe, dieser Artikel hilft Ihnen!
Das obige ist der detaillierte Inhalt vonWie verwende ich Inversion of Control (IoC)-Container mit dem Nette-Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!