ホームページ  >  記事  >  バックエンド開発  >  [Laravel 5 基礎] 26 – サービスコンテナ

[Laravel 5 基礎] 26 – サービスコンテナ

WBOY
WBOYオリジナル
2016-06-20 12:27:09935ブラウズ

サービス コンテナ

はじめに

前のセクションでは、いくつかの共有データを 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 コンテナ、その目的と機能について説明したいと思います。リフレクション メカニズムに基づいてクラスを再帰的に検索します。必要に応じて手動または自動で実行できます。詳細については、公式ドキュメント「サービス コンテナ」を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。