Laravelの「サービスコンテナ」とは何か?

「サービスコンテナ」って何?

 
Laravelの「サービスコンテナ」とは「クラスのインスタンスを管理する機能」のことである。
 

どうして必要なの?

 
アプリケーション内のインスタンスには、例えば「アプリ内で1つだけに制限したいインスタンス」や「設定に前処理が必要なインスタンス」などがある。
 
開発者が、それらの処理を自前で管理するのではなく、サービスコンテナに任せることで楽をすることができる。
 
クラスのインスタンス生成を必ずサービスコンテナ経由ですることで、インスタンスの生成方法をアプリケーション内で共通化できる。
 
これによって、複数の開発者が同じアプリケーションを開発する場合でも、インスタンスの生成方法が統一される。
 

機能は?

 
「サービスコンテナ」にお願いすると、クラスのインスタンスを返してくれる。
 

使い方は?

 

サービスコンテナの取得

 
サービスコンテナを取得するには、こう書けば良い。
 
$app = app();
 
実体は、Illuminate\Foundation\Applicationクラスである。
 

バインド

 
サービスコンテナからインスタンスをもらうためには、前もってインスタンス生成の方法をサービスコンテナに教えておく必要がある。
 
これを「バインド」という。
 
app()->bind(TempLogger::class, function(Application $app) {
   $logger = new Logger('my_log');
   return new TempLogger($logger);
});
 
第1引数に文字列、第2引数にインスタンスの生成処理をクロージャで記述している。
 
TempLogger::classが指定されたら、クロージャの内部に記載された方法でインスタンスを生成してくれるように、バインドしている。
 
この場合、Loggerを’my_log’という引数を渡して初期化し、それをTempLoggerのコンストラクタに渡している。
 
インスタンスの生成方法を変えたければ、ここを変えれば良い。

解決

バインドしたインスタンスを、サービスコンテナが返すことを「解決」(resolve)という
 
$logger = app()->make(TempLogger:class);
 
アプリケーションコード内で、make関数の引数に、バインド済みの文字列を指定することで、インスタンスを返してくれる。