Heim >PHP-Framework >Laravel >Wie schreibe ich eine Laravel-Abhängigkeitsinjektion?

Wie schreibe ich eine Laravel-Abhängigkeitsinjektion?

王林
王林Original
2023-05-20 18:38:38558Durchsuche

Als beliebtes PHP-Framework ist eine der Kernfunktionen von Laravel der Abhängigkeitsinjektionsmechanismus (Dependency Injection, im Folgenden als DI bezeichnet). Mithilfe der Abhängigkeitsinjektion können die Abhängigkeiten eines Objekts vom Objekt selbst entkoppelt werden, wodurch die Lesbarkeit, Testbarkeit und Wartbarkeit des Codes verbessert wird. In diesem Artikel wird erläutert, wie die Laravel-Abhängigkeitsinjektion implementiert und verwendet wird.

  1. Grundkonzept

Abhängigkeitsinjektion ist ein Entwurfsmuster, dessen Kernidee darin besteht, die Kopplung zu reduzieren, die Testbarkeit und die Wartbarkeit zu verbessern, indem die vom Objekt benötigten Abhängigkeiten von den sexuellen Zwecken entkoppelt werden. Im Laravel-Framework basiert die Implementierung des DI-Mechanismus auf dem Dependency Injection Container (im Folgenden als DI-Container bezeichnet), der hauptsächlich die folgenden Punkte umfasst:

  • Automatische Injektion von Objektattributen: Der DI-Container führt das aus Injektion der Attribute des Objekts, die injiziert werden müssen. Automatische Injektion.
  • Automatische Bindung und Auflösung von Abhängigkeiten: Der DI-Container bindet und löst automatisch Abhängigkeiten zwischen Klassen auf.
  • Unterstützung des Singleton-Modus: DI-Container können die Verwendung des Singleton-Modus unterstützen.

Nachdem wir das Grundkonzept des DI-Containers verstanden haben, können wir beginnen, seine spezifische Implementierung im Laravel-Framework zu untersuchen.

  1. Implementierung des DI-Containers

Im Laravel-Framework basiert die Implementierung des DI-Containers auf dem Service-Container (Service Container), der die App-Klasse ist. Die App-Klasse ist die Kernklasse der gesamten Anwendung. Sie ist für die Verwaltung, Registrierung und Auflösung aller zu verwendenden Dienste und Abhängigkeiten verantwortlich. Daher ist sie auch die Kernklasse des DI-Containers in Laravel. Werfen wir einen Blick auf die spezifische Implementierung des Service-Containers.

2.1 Dienstregistrierung und -analyse

Die Dienstregistrierung in Laravel umfasst hauptsächlich zwei Schritte: die Registrierung eines Dienstanbieters und die Registrierung eines Dienstes. Durch die Registrierung eines Dienstanbieters soll eine einheitliche Verwaltung und Registrierung von Diensten ermöglicht werden, anstatt Dienste jedes Mal manuell registrieren zu müssen. Der Registrierungsdienst besteht darin, Objekte zur anschließenden Analyse in den DI-Container einzufügen.

Der registrierte Dienstanbieter kann in der Konfigurationsdatei config/app.php konfiguriert werden. Fügen Sie einfach den Dienstanbieter im Provider-Array hinzu. Zum Beispiel:

'providers' => [
    // Laravel Framework Service Providers...
    IlluminateAuthAuthServiceProvider::class,
    IlluminateBroadcastingBroadcastServiceProvider::class,
    IlluminateBusBusServiceProvider::class,
    IlluminateCacheCacheServiceProvider::class,

    // Application Service Providers...
    AppProvidersAppServiceProvider::class,
    AppProvidersAuthServiceProvider::class,
    AppProvidersEventServiceProvider::class,
    AppProvidersRouteServiceProvider::class,
],

Der Registrierungsdienst kann über die Bindungsmethode der App-Klasse registriert werden. Zum Beispiel:

// 将Foo类注册到DI容器中
app()->bind('foo', function() {
    return new Foo();
});

Im obigen Beispielcode registrieren wir die Foo-Klasse über die Bindungsmethode im DI-Container und geben den entsprechenden Alias ​​als foo an. Beachten Sie, dass Sie in Laravel einen Alias ​​für den Dienst angeben können, um das Parsen und Aufrufen zu erleichtern.

Der Analysedienst kann über die make-Methode der App-Klasse analysiert werden. Zum Beispiel:

// 通过别名解析Foo类实例
$foo = app('foo');

2.2 Automatische Auflösung von Diensten

In Laravel löst der DI-Container automatisch die Abhängigkeiten zwischen Klassen auf, sodass wir die Abhängigkeiten nicht manuell übergeben müssen, und der DI-Container kann uns automatisch bei der Lösung der Abhängigkeitsinjektion helfen Problem. Wir haben zum Beispiel die folgenden zwei Klassen:

class Foo {
    public function __construct(Bar $bar) {}
}

class Bar {
    public function __construct(Baz $baz) {}
}

Hier hängt die Foo-Klasse von der Bar-Klasse und die Bar-Klasse von der Baz-Klasse ab. Wenn wir eine Instanz der Foo-Klasse erstellen möchten, müssen wir sie nur über den DI-Container auflösen:

// 自动解析依赖关系,并通过DI容器创建Foo类实例
$foo = app(Foo::class);

Hier erstellt der DI-Container automatisch Instanzen der Klassen Bar und Baz und fügt sie in den Konstruktor ein Foo-Klasse.

2.3 Singleton-Dienstmodus

In Laravel können wir einen Dienst über die Singleton-Methode als Singleton-Modus registrieren, was bedeutet, dass bei jedem Aufruf des Dienstes dieselbe Instanz zurückgegeben wird. Beispiel:

// 将Foo类注册为单例模式
app()->singleton('foo', function() {
    return new Foo();
});

Hier registrieren wir die Foo-Klasse über die Singleton-Methode als Singleton-Modus, was bedeutet, dass bei jedem Aufruf des foo-Dienstes dieselbe Instanz der Foo-Klasse zurückgegeben wird.

  1. Zusammenfassung

Der DI-Containermechanismus von Laravel vereinfacht den Implementierungsprozess der Abhängigkeitsinjektion erheblich und ermöglicht uns eine flexiblere und bequemere Verwaltung und Nutzung von Abhängigkeiten. Bei Verwendung des Laravel-Frameworks wird die Beherrschung der Verwendung von DI-Containern unsere Entwicklungseffizienz erheblich verbessern und auch viele Vorteile in Bezug auf die Testbarkeit und Wartbarkeit des Codes mit sich bringen. Dieser Artikel stellt die grundlegenden Konzepte, Implementierung und Verwendung von DI-Containern in Laravel vor. Ich hoffe, dass er für alle hilfreich sein kann.

Das obige ist der detaillierte Inhalt vonWie schreibe ich eine Laravel-Abhängigkeitsinjektion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn