サービスコンテナについて

2018/10/12

前回DIコンテナについての記事をエントリーしました。

DIコンテナについて

(※ DIコンテナとはクラスのインスタンスを一括で済むようにしたものです。)

Laravelでは DIコンテナ を サービスコンテナ と呼びます。

(※ 以前は IoCコンテナ と呼ばれていました。)

今回はサービスコンテナについてエントリーします。

 

サービスコンテナとは

サービスコンテナとはクラス(サービス)のインスタンス化を管理する仕組みです。

実際のコーディングではサービスコンテナにインスタンス生成方法を結び付けて利用します。

これを バインド と呼びます。

処理の流れとしては

1)サービスコンテナにクラスを登録(バインド)
2)サービスコンテナからクラスを生成(リゾルブ)

具体的な使い方を見てみます。

 

1)サービスコンテナにクラスを登録(バインド)

まずはサービスコンテナにクラスを登録(バインド)します。

:
$this->app->bind('sender','MailSender');
:
【 サービスコンテナの解説 】
$this->app がサービスコンテナになります。
【 バインドの解説 】
サービスコンテナ($this-app)に bind()メソッド でクラス(MailSender)を登録します。
第一引数にキー名(sender)、第二引数にクラス名(MailSender)入れて紐付けして登録しています。

 

2)サービスコンテナからクラスを生成(リゾルブ)

サービスコンテナに登録したクラスを呼び出してインスタンスを生成します。

この処理は resolve(リゾルブ) と呼びます。

:
$sender = $this->app->make('sender');
:
【 解説 】
サービスコンテナ($this->app)からキー名(sender)に対応するクラスを生成します。
このケースでは MailSender のインスタンスが返ってきます。

 

チュートリアル

チュートリアルを通してLaravelのサービスコンテナを理解します。

 

仕様

上記の仕様に基づいたコーディングが以下になります。

 

手順

1)インタフェース定義
2)実装
3)バインド
4)リゾルブ
5)動作確認

【 解説 】
コードは routes.php に全て記述します。

 

1)インタフェース定義

まず抽象クラス "Animal" を定義します。

:
interface AnimalInterface{
  public function cry();
}
:

 

2)実装

インターフェースを実装してクラスを作成。

class DogClass implements AnimalInterface{
  public function cry(){
  return "bow-wow";
  }
}

class CatClass implements AnimalInterface{
  public function cry(){
  return "neow";
  }
}

 

3)バインド

サービスコンテナに DogClassクラスを onomatopoeia としてキー名を登録。

:
$this->app->bind('onomatopoeia','DogClass');
:
CatClass を使いたい場合は

:
$this->app->bind('onomatopoeia','CatClass');
:

と記述します。
第二引数を変えるだけなので便利。

 

4)リゾルブ

先ほどサービスコンテナに登録したDogClassクラスをキー名(onomatopoeia)で呼び出します。

:
Route::get('cry/',function(){
  $onomato = $this->app->make('onomatopoeia');
  return $onomato->cry();
});

 

5)動作確認

http://{ホスト}/cry にアクセス。

上記のように "bow-wow" と表示されていればOKです。

サービスコンテナについては以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識