Laravelで依存性注入を実装する方法

PHPz
リリース: 2023-04-14 16:20:15
オリジナル
940 人が閲覧しました

Laravel は、依存関係注入設計パターンを採用する人気のある PHP フレームワークです。依存性注入 (略して DI) は、オブジェクト自体によって依存関係を作成または検索するのではなく、依存関係をオブジェクトに渡すことによってコード間の結合を減らす設計パターンです。

非オブジェクト指向、非 DI コードでは、オブジェクトが必要な場合、通常、コード内でオブジェクトの構築に必要なクラスを見つけ、インスタンス化してオブジェクトへのポインタを取得する必要があります。クラス。引用。このアプローチには、次のような多くの問題があります。

  1. オブジェクトのインスタンス化は結合されすぎており、さまざまな状況に柔軟に対応できません。
  2. 単体テストには適さないため、テストのために複数のクラスをインスタンス化する必要があります。
  3. コードは重複する傾向があります。

DI 設計パターンを通じて、複雑なクラスのインスタンス化を管理用フレームワークに引き渡し、フレームワークにオブジェクトの作成と依存関係の挿入を支援させることで、上記の問題を簡単に解決できます。 Laravel フレームワークでは、DI はサービス コンテナ パターンを通じて実装されます。

サービスコンテナはLaravelが提供するクラスの依存関係を管理するツールで、サービスコンテナを通じて依存関係の注入を実装できます。サービス コンテナは、アプリケーションのライフ サイクル全体を通じてサービスを提供するオブジェクト インスタンスのリストを内部的に維持します。これにより、オブジェクト実装の再利用が可能になり、繰り返し作成される問題が回避され、同時にオブジェクト間の関係がより適切に分離されます。

Laravel では、サービス プロバイダーを定義することが依存関係注入を実装する最初のステップです。サービス プロバイダーは、アプリケーション内のクラス、インターフェイス、または任意のオブジェクトを登録し、クロージャまたはコントローラーのコンストラクターで依存関係の注入に使用できるようにするクラスです。

サービス プロバイダーは、Illuminate\Support\ServiceProvider を継承する必要があります。 register() メソッドでは、bind() メソッドを使用して、クラスまたはインターフェイスをサービス コンテナにバインドできます。インスタンス化されたクラスが必要な場合、サービス コンテナは定義に基づいてインスタンスを自動的に作成し、それを返します。

たとえば、Foo というクラスを作成し、サービス コンテナに登録します。コントローラーでクラスを呼び出す場合、コンストラクターでクラスを参照するだけで、サービス コンテナーに Foo クラスのインスタンスが自動的に挿入されます。

use App\Services\Foo;

...

class MyController extends Controller {
    public function __construct(Foo $foo) {
        $this->foo = $foo;
    }
    
    public function index() {
        return $this->foo->doSomething();
    }
}
ログイン後にコピー

上記の例では、Foo クラスがコントローラーのコンストラクターで参照されており、サービス コンテナーが自動的に Foo クラスのインスタンスを作成し、それを MyController クラスのコンストラクターに挿入します。インスタンスメソッドを任意に呼び出してDependency Injection機能を実現します。

bind() メソッドに加えて、サービス プロバイダーは、singleton() メソッドを使用してオブジェクトをサービス コンテナにバインドすることもできます。オブジェクトはアプリケーション全体に対して 1 回だけ作成され、すべてのアプリケーションで共有されます。コード。

つまり、依存関係の注入は、最新の PHP 開発プロセスに不可欠な部分になっています。 Laravel のサービス コンテナ メカニズムにより、依存関係の注入がより洗練され、コードが簡素化され、プログラマはビジネス機能の実装にさらに集中できるようになります。 Laravel サービスコンテナの使い方をマスターすると、効率的で保守しやすい PHP コードを作成するのに役立ちます。

以上がLaravelで依存性注入を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート