はじめに
前のセクションでは、いくつかの共有データを 1 つのポータルに統合したことによる利点は明らかであり、不要なデータが削減されます。コントローラーへのアクセスが必要です。このセクションでは、サービス コンテナーについて説明します。
手順
開発環境: Windows 7
Laravel バージョン: 5+
IDE: Phpstorm
セクション 25 です。たくさんのことについて話しましたが、サービス コンテナについてはまだ触れていません。これが何であるかについて話しましょう。
いわゆるサービス コンテナは、クラスの依存関係または依存関係の注入を管理するマネージャーです。 「依存性注入」とは何ですか? まず「依存性」について説明します。「依存性」関係を形成するには、参加者の数が 2 以上である必要があります。あるクラスは別のクラスを使用する可能性があります。つまり、依存性が生じています。英語では「注射」とは何ですか? 病院では、どんな病気になっても、何を必要としますか。どのような種類の注射が必要か、どのような液体が必要か、すべてはあなた次第です。あなたの特定の状態や症状に応じて、これらの薬を体内に「注射」します。したがって、合計すると、「依存関係の注入」とは、この「依存関係」関係がいつ必要になり、いつ「注入」されるかを意味します。
特にプログラミングでは、依存関係の注入は、コンストラクターまたはセッター メソッドを介してパラメーターを渡すことによって実現されます。
routes.php を開きます。ここにはすべてのルートが含まれています。ファイルにルートを追加します。
Route::get('bar',function(Bar $bar){ dd($bar);});
ある程度のプログラミング経験のある学生は、このクラスをまったく定義していないため、このルートでは bar クラスが見つからないことを知っています。実行すると必ずエラーが発生します。 (テストする必要はありません。自分でテストできます。)
しかし、このルートに別のバークラスを追加すると、状況は異なります:
class Bar{}
私のウェブページに出力されているのは「bar {#143}」ですが、これは $bar などのアドレスであるはずです。
しかし、bar クラスのインスタンス化オブジェクトをクロージャー メソッドに明示的に提供していないことに気づいたでしょうか。たとえば、次のようになります。
$bar = new Bar();
このようなステートメントは、しかし、Laravel はそのクラスを見つけることができます。
これは、PHP の中心的なメカニズムである「リフレクション」を通じてクラスを再帰的に検索し、サービス コンテナが自動的にクラスをバインドする機能です。
次に、自動と手動があります。手動でバインドしたい場合は、次のこともできます。
App::bind('Bar',function(){ return new Bar();});
上記のコードを追加した後、そのクラスは次のようになります。 Appクラスの静的メソッドbind()を通じてバインドされています。冒頭で述べたように、あなたがバインドしなくても、Laravel がバインドしてくれます。
実装する必要があるインターフェイスがある場合、この時点でそのインターフェイスをクラスにバインドし、バインディングを通じてインターフェイスを実装できます。例:
interface BarInterface{}class Bar implements BarInterface{}Route::get('bar',function(BarInterface $bar){ dd($bar);});
現時点でクラス Bar が BarInterface を実装していることをサービス コンテナにどのように知らせることができますか?以下をご覧ください:
interface BarInterface{}class Bar implements BarInterface{}App:bind('BarInterface','Bar');Route::get('bar',function(BarInterface $bar){ dd($bar);});
または:
interface BarInterface{}class Bar implements BarInterface{}App:bind('BarInterface','Bar');Route::get('bar',function(){ $bar = App::make(['BarInterface']); dd($bar);});
とても簡単です。
Laravel ルーティングを学習していたとき、チュートリアルで次のことを教えた理由を今でも覚えているでしょうか。
Route::get('/home', 'HomeController@index');
初期の Routes.php は次のようになります:
Route::get('/', function () { return view('welcome'); });
実際、それらの機能は同じであり、MVC の概念を反映しているだけであり、それぞれが独自の義務を実行し、独自のカテゴリに書かれており、見た目もすっきりしています。
今日の内容は実際に、Laravel の Service Container コンテナ、その目的と機能について説明したいと思います。リフレクション メカニズムに基づいてクラスを再帰的に検索します。必要に応じて手動または自動で実行できます。詳細については、公式ドキュメント「サービス コンテナ」を参照してください。