サービスコンテナとは
Laravel サービスコンテナは、クラスの依存関係を管理し、依存関係注入の実行。
Laravel 公式ドキュメントのサービス コンテナの説明から、その役割は依存関係注入の管理と実行を支援することであることがわかります。
サービス コンテナを使用する理由
「依存関係の挿入」では、依存関係の挿入を使用するとコードの結合を大幅に削減できることがわかりましたが、管理が必要になるという欠点もあります。注入されたオブジェクトは自分で作成します。
コンポーネントに多くの依存関係がある場合、依存関係を渡すために複数のパラメーターを持つセッター メソッドを作成するか、依存関係を渡すために複数のパラメーターを持つコンストラクターを作成する必要があります。さらに、コンポーネントを使用する前に毎回依存関係を作成する必要がありますこれにより、このようなコードの保守性が低下します。
したがって、依存インスタンスにコンテナ (サービス コンテナ) を提供することは、実用的で洗練された方法です。
たとえば、次はlaravelのエントリファイルです(コメントは削除されています):
// public/index.php <?php require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);
// bootstrap/app.php <?php $app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../') ); $app->singleton( Illuminate\Contracts\Http\Kernel::class, App\Http\Kernel::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); return $app;
まず、bootstrap/app.php
を見てください。ここで、$app
は Illuminate\Foundation\Application
のインスタンスであり、Illuminate\Foundation\Application
クラスは Container から継承するため、$app
は実際にはサービス コンテナです。
次に、次の 3 つのシングルトン メソッドは、依存関係がいつ定義されるかを定義します。 Illuminate\Contracts\Http\Kernel
、Illuminate\Contracts\Console\Kernel
、Illuminate\Contracts\Debug \ExceptionHandler
これら 3 つのインターフェイスを使用する場合、どのクラスをシングルトンとして注入する必要があります。
次に、public/index.php
を見てください。make メソッドは実際にサービス コンテナを使用して新しい Illuminate\Contracts\Http\Kernel
インスタンスを作成します。これは通常の new インスタンスとは異なります。つまり、彼の依存関係が自動的にそこに挿入されます。
とても簡潔ですね?
実は、Laravel だけでなく、Yii2 や Phalcon などのフレームワークもコンテナを実装することで依存関係の注入を管理しています。
サービスコンテナの使い方
コンテナなので、物を入れることと取り出すことの2つでしかありません。解決中 (解決中) )。
コンテナの取得
Laravel のサービス プロバイダーでは、$this->app
を通じてコンテナを取得できます。また、app を使用することもできます。 ()
コンテナを取得します。
Laravel の外部でサービスコンテナを使用する場合は、新しい Illuminate\Container\Container
を作成してコンテナを取得します。
$container は、取得したコンテナを表すために以下で使用されます。
Binding
Binding はインターフェイスのインスタンスを返します
//使用闭包 $container->bind('BarInterface', function(){ return new Bar(); }); //或者使用字符串 $container->bind('FooInterface', 'Foo');
-
バインディング シングルトン
シングルトン メソッドは、一度だけ解析されるクラスまたはインターフェイスをコンテナーにバインドし、後続の呼び出しではコンテナーから同じインスタンスを返します。
$container->singleton('BarInterface', function(){ return new Bar(); });
インスタンスのバインド
インスタンス メソッドを使用して、既存のオブジェクト インスタンスをコンテナにバインドすることもできます。後続の呼び出しでは、コンテナから指定されたインスタンスが返されます。
$bar = new Bar(); $bar->setSomething(new Something); $container->instance('Bar', $bar);
状況バインディング
場合によっては、同じインターフェイスを使用する 2 つのクラスですが、各クラスが異なる実装を注入できるようにしたいとします。
$container->when('Man') ->needs('PartnerInterface') ->give('Woman'); $container->when('Woman') ->needs('PartnerInterface') ->give('Man');
Mark
分析特定の「カテゴリ」にあるすべてのバインディングを解析する必要がある場合があります。
#$container->bind('Father', function () { // }); $container->bind('Mother', function () { // }); $container->bind('Daughter', function () { // }); $container->bind('Son', function () { // }); $container->tag(['Father', 'Mother', 'Daughter', 'Son'], 'familyMembers'); $container->bind('Family', function ($container) { return new Family($container->tagged('familyMembers')); });
- makeメソッド
$foo = $container->make('Foo');
- #Arrayメソッド
-
$bar = $container['Bar'];
- 解決は境界としてマークされます
-
$familyMembers = $container->tagged('familyMembers'); foreach ($familyMembers as $inpidual) { $inpidual->doSomething(); }
イベントの解決
関連する推奨事項:$container->resolving(function ($object, $container) { // 当容器解析任何类型的对象时会被调用... }); $container->resolving('Foo', function (Foo $foo, $container) { // 当容器解析「Foo」类型的对象时会被调用... });
最新の 5 つの Laravel ビデオ チュートリアル