ホームページ  >  記事  >  PHPフレームワーク  >  laravelのサービスコンテナについて話しましょう

laravelのサービスコンテナについて話しましょう

藏色散人
藏色散人転載
2021-07-26 15:53:462320ブラウズ

サービスコンテナとは

Laravel サービスコンテナは、クラスの依存関係を管理し、依存関係注入の実行。

Laravel 公式ドキュメントのサービス コンテナの説明から、その役割は依存関係注入の管理と実行を支援することであることがわかります。

サービス コンテナを使用する理由

「依存関係の挿入」では、依存関係の挿入を使用するとコードの結合を大幅に削減できることがわかりましたが、管理が必要になるという欠点もあります。注入されたオブジェクトは自分で作成します。
コンポーネントに多くの依存関係がある場合、依存関係を渡すために複数のパラメーターを持つセッター メソッドを作成するか、依存関係を渡すために複数のパラメーターを持つコンストラクターを作成する必要があります。さらに、コンポーネントを使用する前に毎回依存関係を作成する必要がありますこれにより、このようなコードの保守性が低下します。
したがって、依存インスタンスにコンテナ (サービス コンテナ) を提供することは、実用的で洗練された方法です。
たとえば、次はlaravelのエントリファイルです(コメントは削除されています):

// public/index.php
<?php

require __DIR__.&#39;/../bootstrap/autoload.php&#39;;

$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;

$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__.&#39;/../&#39;)
);

$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\KernelIlluminate\Contracts\Console\KernelIlluminate\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 ビデオ チュートリアル

以上がlaravelのサービスコンテナについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。