LoginSignup
5
3

More than 3 years have passed since last update.

Laravel サービスプロバイダ

Last updated at Posted at 2019-10-08

サービスプロバイダとは

  • Laravelのサービスコンテナへのバインド処理で利用する機能。
  • FWやアプリケーションに含まれるサービス(機能)の初期処理を行う。
  • Laravelのライフサイクルでは、ビジネスロジックが実行される前に、サービスプロバイダのメソッドが呼ばれる。

役割

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

基本的な動作

  • Laravelの初期処理で、各サービスプロバイダのregisterメソッドが実行される。
  • registerメソッドでは、サービスコンテナへのバインドのみ行う。(メソッドの実行タイミングでは、サービスコンテナから他の機能のインスタンスを取得する処理を実行できないため。)
  • すべてのregister処理が終わると、bootメソッドが呼ばれる。
  • registerメソッドの実装は必須、bootメソッドは任意。

deferプロパティによる遅延実行

  • deferプロパティをtrueに設定することで、アプリケーション起動時のregisterメソッドの実行を遅らせることができる(デフォルトはfalse)。
  • この場合、registerメソッドの実行タイミングを指定するため、providesメソッドもしくはwhenメソッドで指定する必要がある。

providesメソッド

  • サービスコンテナで解決する文字列を指定する。
  • 文字列の解決をサービスコンテナに依頼したタイミングで、サービスプロバイダのregisterメソッドが呼ばれ、解決が行われる。

whenメソッド

  • イベントを指定する。
  • 対象イベント名を配列で指定すると、リスナーが登録され、その中でサービスプロバイダのregisterメソッドが実行される。
  • 設定したイベントが発行されると、このリスナーが発動して、registerメソッドが実行される。

provideswhenいずれの場合も、サービスコンテナでの解決やイベントの発行がアプリケーション内で実行されるまで、インスタンス登録は行われない。

コード例


class SampleServiceProvider extends ServiceProvider
{
    protected $defer = true;

    public function register()
    {
        $this->app->singleton('foo', function ($app) {
            return new Foo($app);
        });
        $this->app->singleton('bar', function ($app) {
            return new Bar($app);
        });
        $this->app->singleton('buzz', function ($app) {
            return new Buzz($app);
        });
    }

    public function provides()
    {
        return [
            'foo', 'bar', 'buzz'
        ];
    }
}

上記の例では、サービスプロバイダのprovidesメソッドで、文字列を要素とした配列を返している。ビジネスロジックでfooなどのクラス名をサービスコンテナで解決すると、registerメソッドが実行され、ロジック側にインスタンスが返される。

参考図書

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3