Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung des IOC-Containers im Laravel-Framework

Detaillierte Erläuterung der Verwendung des IOC-Containers im Laravel-Framework

巴扎黑
巴扎黑Original
2017-08-17 16:19:042998Durchsuche

Ich habe kürzlich Laravel gelernt und zufällig etwas über den IOC-Container erfahren, aber ich habe festgestellt, dass es im Internet weniger Informationen zu diesem Bereich gibt, daher werde ich zusammenfassen, was ich gelernt habe. Der folgende Artikel stellt Ihnen hauptsächlich vor IOC-Container im Laravel-Lern-Tutorial. Schauen wir uns die Informationen gemeinsam an.

Vorwort

Laravel verwendet IoC (Inversion of Control, Umkehrung der Kontrolle, dies ist ein Entwurfsmuster, Sie können zuerst die Enzyklopädie nachschlagen) Container this Leistungsstarke Tools zum Verwalten von Klassenabhängigkeiten. Die Abhängigkeitsinjektion (auch ein Entwurfsmuster, das im Allgemeinen zur Implementierung von IoC verwendet wird) ist eine Methode, die das Schreiben von festem Code zur Verarbeitung von Abhängigkeiten zwischen Klassen erfordert. Stattdessen werden diese Abhängigkeiten zur Laufzeit injiziert, was eine größere Flexibilität bei der Handhabung von Abhängigkeiten ermöglicht.

Das Verständnis des Laravel-IoC-Containers ist für die Erstellung leistungsstarker Anwendungen erforderlich und hilft auch dem Laravel-Kern selbst. Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.

Grundlegender Anwendungsfall

Binden eines Typs an einen Container

IoC-Container haben zwei Möglichkeiten, Abhängigkeiten aufzulösen: über Schließung Rückruf oder automatische Lösung. Lassen Sie uns zunächst Abschlussrückrufe untersuchen. Zuerst müssen Sie einen „Typ“ an den Container binden:


App::bind('foo', function($app)
{
 return new FooBar;
});

Holen Sie sich einen Typ aus dem Container


$value = App::make('foo');

Wenn die Methode App::make ausgeführt wird, wird die Abschlussfunktion ausgeführt und das Ergebnis zurückgegeben.

Binden Sie einen „gemeinsam genutzten“ Typ an den Container

Manchmal möchten Sie den an den Container gebundenen Typ nur einmal verarbeiten und ihn dann aus dem Container abrufen Sie sollten alle die gleiche Instanz sein:


App::singleton('foo', function()
{
 return new FooBar;
});

Binden Sie eine vorhandene Typinstanz an den Container

Sie können auch die Instanz verwenden Methode, bindet eine vorhandene Objektschnittstelle an den Container:


$foo = new Foo;

App::instance('foo', $foo);

Wo soll die Bindung registriert werden

IoC-Bindung erfolgt, ähnlich wie Event-Handler oder Routenfilterung, normalerweise nach dem „Bootstrap-Code“. Mit anderen Worten: Sie werden ausgeführt, wenn Ihre Anwendung bereit ist, die Anforderung zu verarbeiten, also bevor eine Route oder ein Controller tatsächlich ausgeführt wird. Wie anderer Bootcode registriert die Startdatei normalerweise eine Methode als IoC-Bindung. Alternativ können Sie eine Datei app/ioc.php erstellen (der Dateiname muss nicht identisch sein) und diese in die Startdatei einbinden.

Wenn Ihre Anwendung über eine große Anzahl von IoC-Bindungen verfügt oder Sie die IoC-Bindungen basierend auf verschiedenen Kategorien in verschiedene Dateien aufteilen möchten, können Sie die Bindung beim Dienstanbieter versuchen (siehe unten)

Automatisch auflösen

Klasse abrufen

IoC-Container ist in vielen Szenarien leistungsstark genug. Zum Abrufen ist keine Konfiguration erforderlich die Klasse. Beispiel:


class FooBar {

 public function __construct(Baz $baz)
 {
  $this->baz = $baz;
 }

}

$fooBar = App::make('FooBar');

Hinweis: Obwohl wir die FooBar-Klasse nicht im Container registriert haben, kann der Container dies tun Erhalten Sie weiterhin die Klasse Sogar Baz-Abhängigkeiten werden automatisch eingefügt!

Wenn ein Typ nicht an den Container gebunden ist, verwendet der IoC-Container das Reflexionstool von PHP, um die Klasse zu überprüfen und den Typhinweis des Konstruktors zu lesen. Mithilfe dieser Informationen kann der Container automatisch Klasseninstanzen erstellen.

Binden Sie eine Schnittstellenimplementierung

In einigen Fällen kann eine Klasse jedoch von einer Schnittstellenimplementierung und nicht von einer „konkreten Klasse“ abhängen. In diesem Fall muss die Methode App::bind dem Container mitteilen, welche Schnittstellenimplementierung eingefügt werden soll:


App::bind('UserRepositoryInterface', 'DbUserRepository');

Betrachten Sie nun diesen Controller:


class UserController extends BaseController {

 public function __construct(UserRepositoryInterface $users)
 {
  $this->users = $users;
 }

}

Da wir UserRepositoryInterface an eine konkrete Klasse gebunden haben, wird DbUserRepository automatisch in den Controller eingefügt, wenn der Controller erstellt wird.

Echte Anwendungsfälle

Laravel bietet mehrere Möglichkeiten, die Skalierbarkeit und Testbarkeit von Anwendungen mithilfe von IoC-Containern zu verbessern. Ein Paradebeispiel ist die Anschaffung eines Controllers. Alle Controller werden über den IoC-Container abgerufen, was bedeutet, dass Sie Abhängigkeiten im Controller-Konstruktor mit Typhinweisen versehen können und diese automatisch eingefügt werden.

Typhinweise für Controller-Abhängigkeiten


class OrderController extends BaseController {

 public function __construct(OrderRepository $orders)
 {
  $this->orders = $orders;
 }

 public function getIndex()
 {
  $all = $this->orders->all();

  return View::make('orders', compact('all'));
 }

}

In diesem Beispiel wird OrderRepository automatisch in den Controller eingefügt. Das bedeutet, dass bei der Simulation von Anforderungen durch Komponententests das OrderRepository an den Container gebunden und in den Controller eingefügt wird, was eine problemlose Interaktion mit der Datenbankschicht ermöglicht.

Weitere Beispiele für die IoC-Nutzung

Filter, Composer und Event-Handler können auch aus dem IoC-Container bezogen werden. Geben Sie bei der Anmeldung einfach den Klassennamen an, den sie verwenden:


Route::filter('foo', 'FooFilter');

View::composer('foo', 'FooComposer');

Event::listen('foo', 'FooHandler');

Dienstleister

服务器提供器是将一组相关 IoC 注册到单一路径的有效方法。将它们看做是一种引导组件的方法。在服务器提供器里,你可以注册自定义的验证驱动器,使用 IoC 容器注册应用程序仓库类,甚至是自定义 Artisan 命令。

事实上,大多数核心 Laravel 组件包含服务提供器。应用程序所有注册在服务提供器的均列在  app/config/app.php 配置文件的 providers 数组中。

定义服务提供器

要创建服务提供器,只需继承 Illuminate\Support\ServiceProvider 类并且定义一个 register 方法:


use Illuminate\Support\ServiceProvider;

class FooServiceProvider extends ServiceProvider {

 public function register()
 {
  $this->app->bind('foo', function()
  {
   return new Foo;
  });
 }

}

注意:在 register 方法,应用程序通过 $this->app 属性访问 IoC 容器。一旦你已经创建了提供器并且想将它注册到应用程序中, 只需简单的放入 app 配置文件里 providers 数组中。

运行时注册服务提供器

你也可以使用 App::register 方法在运行时注册服务提供器:


App::register('FooServiceProvider');

容器事件

注册获取事件监听者

容器在每次获取对象时都触发一个事件。你可以通过使用 resolving 方法来监听该事件:


App::resolvingAny(function($object)
{
 //
});

App::resolving('foo', function($foo)
{
 //
});

注意:获取到的对象将会传入回调函数中。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des IOC-Containers im Laravel-Framework. 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