サービスプロバイダー&サービスコンテナについて

2018/10/12

Composerを使ってLaravelのライブラリをインストールして設定するときに必ず出てくるキーワードがあります。

それが「サービスプロバイダー」「サービスコンテナ」です。

この意味ですが、Laravelの公式サイトも含め、解説サイトをいろいろ読んだのですが難しい。。

今回チュートリアルを進めながら「サービスプロバイダー」「サービスコンテナ」について理解したいと思います。

 

チュートリアル

サービスプロバイダーとサービスコンテナの意味を理解するために、チュートリアルを実施しながら意味をとらえていきたいと思います。

【チュートリアルの内容】
デモ用のクラスを作成。サービスプロバイダーを作成して、その中でサービスコンテナへサービス(デモ用のクラス)を登録。ファサードを使って表示。

 

手順

【1】クラスを作る

【2】サービスプロバイダーの作成

【3】サービスコンテナを登録する

【4】サービスプロバイダーを登録する

【5】ファサードを作成

【6】ファサードのエイリアスを作成

【7】実際に呼び出して使う

 

【1】クラスを作る

実装するクラス(TestEchoHelperクラス)を以下のように記述します。

デモなのでエコーだけの簡単なプログラムです。

<?php
namespace App\Helpers;

class TestEchoHelper
{
    public function testEcho(){
      return 'TestEchoHelperクラスの呼び出しが成功しました!';
    }
 }

 

【2】サービスプロバイダーの作成

作成したTestEchoHelperクラスを呼び出すためにサービスプロバイダーの機能を使います。

サービスプロバイダー・・・インスタンス化方法を登録する場所
サービスコンテナ・・・インスタンス化方法を定める

まずは、サービスプロバイダーを作成します。

サービスプロバイダーはartisanコマンドでスケルトンを作成することができます。

php artisan make:provider TestEchoServiceProvider

上記のコマンドを実行すると app/providers に TestEchoServiceProvider.php が作成されます。

中身を見てみます。

:
class TestEchoServiceProvider extends ServiceProvider
{

  public function boot()
  {
  //
  }

  public function register()
  {
  //
  }

}

bootメソッドとregisterメソッドができてます。

サービスコンテナへの登録はregisterメソッドに記述します。

その前にuseで

サービスコンテナの実態のクラス(\Illuminate\Contracts\Foundation\Application)とデモで作成したクラス TestEchoHelper クラスのパスを通しておきます。

use Illuminate\Foundation\Application;
use App\Helpers\TestEchoHelper;
:

 

【3】サービスコンテナを登録する

register()で、サービスコンテナへの登録を実装します。

laravelでは「バインドする」とも言います。

 :
  public function register()
  {
    //
    $this->app->bind('TestEcho', function(Application $app){
      return new TestEchoHelper();
    });
  }

$this->app がサービスコンテナになります。

bind() はオブジェクトのインスタンス化方法を登録する関数です。

サービスコンテナにbind()メソッドでキー名(TestEcho)にクラスを紐付けて登録します。

ここまでで「TestEchoHelperクラスを呼び出す方法をサービスコンテナに登録する」作業が終わりました。

ここから先はサービスプロバイダーが呼び出され、ファサードで出力できる処理を書いていきます。

 

【4】サービスプロバイダーを登録する

Laravel起動時にサービスプロバイダーが呼び出されるようにします。

そのためにサービスプロバイダーを config/app.php に登録します。


  'providers' => [

  /*
  * Laravelのコアサービスのサービスプロバイダー
  */
  Illuminate\Auth\AuthServiceProvider::class,
  Illuminate\Broadcasting\BroadcastServiceProvider::class,
:

  /*
  * アプリケーション固有のサービスプロバイダー
  */
  App\Providers\AppServiceProvider::class,
  App\Providers\AuthServiceProvider::class,
:

  /*
  * Composerで追加したパッケージのサービスプロバイダー
  */
  Laravel\Socialite\SocialiteServiceProvider::class,
  App\Providers\TestEchoServiceProvider::class, // サービスプロバイダーの登録

  ],

:

【解説】
Laravelのパッケージをインストールした事のある方は、 app.phpにサービスプロバイダーを登録したことがあるかと思います。
Laravelのライブラリ追加方法

ここに登録することで、Laravel起動時にTestEchoServiceProviderクラスのregisterメソッドとbootメソッド(あれば)が実行されます。

 

【5】ファサードを作成

app/Facades ディレクトリを作成してファサードを作成します。

このFacadeクラスの getFacadeAccesorメソッドに「サービスコンテナに登録されたインスタンス化方法の名前を返す」 処理を記述します。

namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class TestEchoFacade extends Facade
{
  protected static function getFacadeAccessor()
  {
    return 'TestEcho';
  }
}

 

【6】ファサードのエイリアスを作成

作成したファサードを別名(短い名前)で呼び出せるようにしておきます。

ライブラリをいれたことがある方は見覚えがあるかと思います。

config/app.php にてエイリアスを記述します。

 'aliases' => [
  'App' => Illuminate\Support\Facades\App::class,
  'Artisan' => Illuminate\Support\Facades\Artisan::class,
  'Auth' => Illuminate\Support\Facades\Auth::class,
  'Blade' => Illuminate\Support\Facades\Blade::class,
:
  'Socialite' => Laravel\Socialite\Facades\Socialite::class,
  'TestEcho' => App\Facades\TestEchoFacade::class
],
App\Facades\TestEchoFacade:: を TestEcho:: で呼び出せるようにします。

 

【7】実際に呼び出して使う

Controller

class TestContrller extends Controller
{
  public function index(){
    return \TestEcho::testEcho();
    }
}

 
Router

Route::get('/testecho/',[
  'uses' => 'TestController@index',
  'as' => 'testecho'
]);

 
プレビュー

http://{ホスト名}/testecho/ にアクセス

サービスコンテナとサービスプロバイダーに関しては以上です。

本庄マサノリ

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

>> Twitter をフォローする

 

-実践知識