まず、Laravelでcontainerのcontainerクラスを見て少し混乱しましたが、これがiocコンテナであることはわかるのですが、Laravelではよく理解できませんでした。解析を手伝ってください。ServiceProvider クラスも理解するのが難しいということです。時間があれば、原理を理解するのを手伝ってください。その使い方とその理由! よろしくお願いします
既存の情報をお寄せください
zhaoyi記事をありがとうございます
PHP プログラマーは IoC/DI をどのように理解するか
PHP プログラマー 方法依存関係注入コンテナを理解するため
返信内容:
一部の記事に用語が多数あるため、混乱が生じています。いわゆる ioc コンテナに関しては、ioc の実装は単なるアイデアであると思います。戦略パターンと思考を混同すべきではないと思います。 laravel のコンテナは、依存クラスを渡す必要がある場合、たとえばキャッシュ クラスを使用する場合、つまりキャッシュ サービスに依存する場合、依存クラスをサービスとして扱います。コンテナーは特定のインスタンス化を担当します。その仕事は、クラスを解析し、キャッシュ サービスが memcache、redis、またはその他のものであるかどうかを解析し、それをインスタンス化してコンシューマ クラスに注入することで、IOC を実現します。もちろん、これには抽象的な連携が必要です。そうでない場合、個別のものを注入し、メソッドが異なる場合は、当然機能しません。
コンテナはクラスを管理するための単なる手段です。
そこで問題は、コンテナはどのクラス インスタンスを作成するかをどのようにして知るのかということです。つまり、クラスはどのように解析されるのでしょうか?これはサービス プロバイダーでバインドできます。ここで必要な実装をバインドすると、コンテナーがそれを必要とするときに、どのクラスに解決するかを認識します。
そこで再び疑問が生じますが、プログラムはどのサービス プロバイダーが利用可能であるかをどのようにして知るのでしょうか? これは、config/app で定義されます。専門的には、登録サービスです。
自分でサービス プロバイダーを作成し、サービスをバインドして登録することをお勧めします。または、pimple などの他の独立したサービス コンテナーを操作して、それを独自のプロジェクトで使用することもできます。これは理解しやすいです。
ファサードに関しては、実際にコンテナを通して実際のクラスに解析し、その後マジックメソッドを使って実際のクラス上でメソッドを実行するという方が分かりやすいと思います。私も酔っていました。
これは、多くの人がファサードを批判する理由でもあります。これは、構文糖の追加層が詰め込まれているだけです。
Facades はプロキシに似た外観モードで、Laravel でのその機能は実際には PHP の機能と似ています: class_alias
のように、フレームワーク内の名前空間を持つクラスを覚えやすくします。 > IlluminateSupportFacadesApp 。 もう 1 つの利点は、Laravel の外観を簡単にカスタマイズできることです。たとえば、システムが提供するキャッシュが使いにくいと思われる場合、独自のキャッシュを使用します。 , 必要なクラス名に変更するだけです。もちろん、外観には他の利点もありますが、実際のターゲット オブジェクトのクラス定数に直接アクセスできないなどの欠点もあります。
IOC コンテナ IOC コンテナ、上記の 2 つの記事では、その他のことについて非常に明確にしています。もっと一般的な言葉で言えば、このコンテナは私たちのツールに相当します。私たちはどこにでもそれを持ち歩き、それを使用するときは、そこから必要なツールを取り出すだけで済みます。
それでは、ServiceProvider とは何でしょうか? ServiceProvider はコンテナに物 (通常はキャッシュなどの特定の機能を実装するサービスで、いくつかの設定を入れることもできます) を登録するだけで、「ツールボックスにツールを入れて出かける」というプロセスが完了します。フレームワークが実行されます。各 ServiceProvider の register メソッドが呼び出され、サービスの登録と開始が完了します。
これで、コンテナーからサービス インスタンスを取り出し、コントローラーまたは他のフレームワークが開始された後にそれを使用できるようになります。
簡単に説明するとこんな感じですが、5.0のソースコードframework/Application.php・laravel/framework・GitHub
クラスから開始して、実行中のプロセスをステップバイステップで確認することができます。
これがあなたが望んでいることかどうかわかりません。
最近しばらく laave を見ていて感じたのは、
1. IoC は Phalcon の DI と同じで、1 つのコアを持つオブジェクト コンテナです:
<code class="language-php"><span class="x">protected static $instance;</span>
</code>
ログイン後にコピー
これらの概念を理解するために、laravel の範囲から飛び出さないことをお勧めします。実際、それは非常に簡単です:
サービスプロバイダ: Laravel 5.1 ドキュメントガイド - サービスプロバイダ
サービスコンテナ: http://laravelbase.com/collections/1/47
ファサード: http://laravelbase.com/collections/1/49
それはすべて、このいまいましい用語のせいで、人によって使い方が異なります。
端的に言うと、サービスコンテナはインターフェースであり、サービスプロバイダはサービスを提供する実装クラスです。
たとえば、インターフェイス Storage クラス、実装クラス Ftp クラス、Local クラスなどです。