Laravel にはこのトピックに関する多くのチュートリアルがあります。
いわゆる制御の反転とは、メインクラスによって実行されるべきすべてのことをサブクラスによって実行されるように変更することです。この設計アイデアは制御の反転と呼ばれます
。制御の反転を実現するには 多くの方法があります。 ファクトリ モードとは、親クラスが必要なサブクラスを 1 つずつ追加する必要がないことを意味します。ファクトリ クラスを一度新規に作成すると、ファクトリはクラスの依存関係についてサブクラスを決定し、ファクトリはクラス オブジェクトを返し、親クラスはクラス メソッドを直接呼び出すことができます。
ファクトリ モデルは実際には現在の開発方法の多くを満たすことができますが、すべてのモジュールがファクトリ クラスに配置されているため、新しいクラスがある場合はファクトリを変換する必要があります。
次に、インターフェイスの役割について説明します。インターフェイスとは何ですか? このクラスは、実装する必要があるメソッドの名前のみを持ち、インターフェイスを継承するクラスは定義されません。インターフェースのメソッドを使用するには、そのメソッドを実装する必要があります。このようにして、インターフェイスは各サブクラスの呼び出しを制御し、インターフェイスを初期化してすべての作業を完了するだけで済みます。
class Superman{ protected $module; public function __construct(SuperModuleInterface $module) { $this->module = $module }}
そこで、依存性注入の概念が出てきました。すべての依存関係は、内部で生成されない限り (初期化、コンストラクター __construct のファクトリ メソッド、独自のマニュアルなど)、パラメーターなどを使用して外部で生成されます。正式な注入は依存性注入 (DI) に属します。突然悟りを開いたのですか?実際、それはとても簡単です。以下は典型的な依存性注入です:
// 超能力模组$superModule = new XPower;// 初始化一个超人,并注入一个超能力模组依赖$superMan = new Superman($superModule);
次に、最初のバインディング (バインド) 操作を通じて、いくつかのプロダクション スクリプトをスーパー ファクトリに登録しました。これらのプロダクション スクリプトは、プロダクション命令が発行されるときに生成されます。 . 実行、これを IoC コンテナと呼びます
実際には、実際の IoC コンテナはさらに高度です。現在の例では、Superman に必要なモジュール パラメーターを手動で提供する必要がありますが、実際の IoC コンテナは、クラスの依存関係要件に基づいて、登録およびバインドされた多数のインスタンスの中から一致する依存関係要件を自動的に検索し、自動的に挿入します。それらをコンストラクターのパラメーターに追加します。 Laravelフレームワークのサービスコンテナはまさにこれを行います。この関数の実装は理論上はそれほど難しくありませんが、書くのが面倒なのでこの記事では書きません。ただし、依存関係要件を自動的に検索するこの機能はリフレクションを通じて実装されていることをお伝えしておきます
IoC コンテナーを紹介する前のセクションで、クラスは登録された場合にのみバインドする必要があると述べました。コンテナ内で「製造」できるかどうか。
はい、クラスをコンテナーによって抽出するには、まずクラスをコンテナーに登録する必要があります。 laravelはこのコンテナをサービスコンテナと呼ぶため、サービスが必要な場合は、まずサービスを登録してコンテナにバインドする必要があります。次に、サービスを提供し、サービスをコンテナにバインドするのはサービスプロバイダ(ServiceProvider)です。
ただし、クラスをコンテナにバインドするには、必ずしもサービス プロバイダーを経由する必要はありません。
ただし、クラスやモジュールが他のクラスやコンポーネントを必要とする場合があることはわかっています。必要なモジュールやコンポーネントが初期化フェーズ中に登録解除されないようにするために、laravel は登録動作と初期化動作を分離します。は登録時のみ登録可能、初期化時は初期化可能です。分割後の製品は現在のサービスプロバイダーとなります。
サービスプロバイダーは主に register (登録) と boot (ブート、初期化) の 2 つの部分に分かれており、詳細についてはドキュメントを参照してください。 register は「スクリプト」をコンテナに登録する役割を果たしますが、登録部分で未知のものに依存しないように注意してください。その場合は、ブート部分に移動します。
https://phphub.org/topics/789