ホームページ >バックエンド開発 >PHPチュートリアル >【Laravel5基礎】25 – ビューパーシャルで常にデータを受信したい場合
はじめに
前のセクションでは、ラベルの選択をより合理的にするために、ラベルの選択にいくつかの最適化を行いました。このセクションでは、サービス コンテナーについて説明します。
手順
開発環境: Windows 7
Laravelバージョン: 5+
IDE: Phpstorm
セクション25では、たくさんのことについて話しましたが、サービスコンテナについてはまだ触れていません次はこれが何なのか教えてください。
サービス コンテナ
特にプログラミングでは、依存関係の注入はコンストラクターまたはセッター メソッドを介してパラメーターを渡すことによって実現されます。
routes.php を開きます。ここにはすべてのルートが配置されています。ファイルにルートを追加します:
Route::get('bar',function(Bar $bar){ dd($bar);});
ある程度のプログラミング経験のある学生は、このクラスをまったく定義していないため、このルートでは bar クラスが見つからないことを知っており、実行時に必ずエラーが報告されます。 (テストする必要はありません。自分でテストできます。)
しかし、このルートに bar クラスを追加すると、状況は異なります:
class Bar{}
私の Web ページに出力されるのは、「bar {# 143 }" は、$bar などのアドレスである必要があります。
しかし、次のステートメントのように、bar クラスのインスタンス化オブジェクトをクロージャー メソッドに明示的に提供していないことに気づきましたか:
$bar = new Bar();
しかし、Laravel はそのクラスを見つけることができます。
これは、PHP の中心的なメカニズムである「リフレクション」を通じてクラスを再帰的に検索し、サービス コンテナが自動的にクラスをバインドする機能です。
次に、自動と手動があります。手動でバインドしたい場合は、次のこともできます。
App::bind('Bar',function(){ return new Bar();});
上記のコードを追加した後、App クラス種類の静的メソッド binding() を介してバインドしました。冒頭で述べたように、あなたがバインドしなくても、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);});
それはとても簡単です。
最初に戻る
Route::get('/home', 'HomeController@index');
しかし、最初の Routes.php には次の式がありました 息子の:
Route::get('/', function () { return view('welcome'); });
実際、それらの機能は同じですが、MVC の概念を反映するために、それぞれが独自の役割を実行し、独自のクラスで記述されているため、見た目はすっきりしています。
まとめ