実践知識

サービスプロバイダーについて

2018/10/12

前回、Laravelのサービスコンテナについてエントリーしました。

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

上記の記事にあるチュートリアルでは routes.php にサービスコンテナの結合処理(バインド)を記述しました。

しかし、普通はサービスコンテナの結合処理はこのサービスプロバイダーに記述します。

サービスプロバイダーとは、Laravelが起動する時の初期処理を記述したクラスのことを言います。

今回はサービスプロバイダーについてエントリーします。

 

サービスプロバイダーとは

Laravelはサービス毎に初期処理を定義し、実行する仕組みを持っています。

初期処理の実装を行うクラスのことをサービスプロバイダーと言います。

サービスプロバイダーでは以下の役割を果たします。

・サービスコンテナへのバインド
・イベントリスナーやミドルウェア、ルーティングの登録
・外部コンポーネントを組み込む

チュートリアルでは「サービスコンテナへのバインド」についてフォーカスします。

 

チュートリアル

サービス(Utilクラス)を作成してサービスプロバイダーに登録。ルーティングでサービスをコール。

手順

1)サービスの作成
2)サービスプロバイダーの作成
3)Utilサービスのバインド
4)サービスプロバイダーを登録
5)ルーティングの設定
6)動作確認

 

1)サービスの作成

サービスとは "クラス" のことです。

app/ServicesディレクトリにUtil.phpを作成します。

Util.phpはデモなので簡単なものを作成します。

getMessageメソッドがコールされると "ごきげんよう" と返す簡単なスクリプトを作成します。

<?php
namespace App\Providers;

class Util
{

  public static function getMessage()
  {
  return 'ごきげんよう';
  }

}

 

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

サービスプロバイダーの作成はartisanコマンドで用意されています。

php artisan make:provider UtilServiceProvider

app/Providers/UtilServiceProvider.php が作成されます。

 

3)Utilサービスのバインド

サービスプロバイダーのひな形を使って以下のようにコーディングします。

サービスコンテナの結合処理(バインド)はこのサービスプロバイダーに記述します。

サービス(Utilクラス)に対してインスタンスを生成するように記述しています。

:
  public function register()
  {
     $this->app->bind( 'util', 'app\Services\Util' );
  }

$this->app はサービスコンテナです。

registerメソッドではサービスコンテナへのバインドのみ行います。

第一引数にキー名(util)、第二引数にクラス名(Util)入れて紐付けして登録しています。

【 解説 】
サービスプロバイダには、registerメソッド以外にもbootメソッドがあります。
bootメソッドはregisterメソッドによる初期処理が完了した後に実行されます。
サービスコンテナで解決したインスタンスを利用した処理を記述できます。
イベントリスナー登録やルーティングなどの処理はこのメソッドで実装します。
なお、このメソッドはオプションとなっており、不要な場合は実装しません。

 

4)サービスプロバイダーを登録

サービスプロバイダーができたら config/app.php に登録します。

ここに登録されているサービスプロバイダーは、Laravelの起動処理で全て呼び出されます。


  '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\UtilServiceProvider::class,

  ],

 

5)ルーティングの設定


use App\Services\Util; // 1)

Route::get('util/', function(Util $util){ // 2)
  return $util->getMessage(); // 3)
});
【 解説 】
1)サービス(Utilクラス)のエイリアスを作成
2)無名関数でサービスの呼び出し
3)サービスのメソッドをコール

 

6)動作確認

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

上記のように表示されればOKです。

サービスプロバイダーについては以上です。

本庄マサノリ

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

 

-実践知識