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

藏色散人
リリース: 2021-07-27 08:57:03
転載
2291 人が閲覧しました

サービスコンテナとは

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!