サービスプロバイダーはlaravelアプリケーションの起動の中心です。独自のアプリケーションと Laravel のコア サービスは、サービス プロバイダーを通じて起動されます。
しかし、活性化とは何を意味するのでしょうか?通常、これは、登録されたサービス、イベント リスナー、ミドルウェア、ルーティングのバインドを含む登録を意味します。サービス プロバイダーはアプリケーション構成の中心です。
config/app.php ファイルを開くと、プロバイダー配列が見つかります。これらは、アプリケーションがロードするサービス プロバイダー クラスです。もちろん、多くは遅延読み込みプロバイダーです。つまり、すべてのリクエストがこれらのプロバイダーをロードするわけではなく、必要な場合にのみロードされます。
この記事では、独自のサービス プロバイダーを作成し、それをアプリケーションに登録する方法を学びます。
すべてのサービス プロバイダーは IlluminateSupportServiceProvider クラスを継承します。この抽象クラスでは、プロバイダーが少なくとも 1 つの register メソッドを定義する必要があります。 register メソッドでは、サービス コンテナにコンテンツのみをバインドする必要があります。イベント リスナー、ルーティング、その他の関数を登録しようとしないでください。
Artisan CLI は、make:provider コマンドを使用して新しいプロバイダーを簡単に生成できます。
php artisan make:provider RiakServiceProvider
前述したように、登録メソッドでは、実行することは 1 つあり、それはトランザクションをサービス コンテナにバインドすることです。他には何もしないでください。そうでない場合は、ご利用のプロバイダーが提供するサービスが登録されていない可能性があります。ここで、最も基本的なサービス プロバイダーを見てみましょう。
<?phpnamespace App\Providers;use Riak\Connection;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider{ /** * Register bindings in the container. * * @return void */ public function register() { $this->app->singleton(Connection::class, function ($app) { return new Connection(config('riak')); }); }}
このサービス プロバイダーは register メソッドのみを定義し、このメソッドを使用してサービス コンテナー内の RiakConnection の実装を定義します。サービス コンテナの仕組みがわからない場合は、サービス コンテナのドキュメントを参照してください。
サービスプロバイダーにビューコンポーザーを登録したい場合は、boot メソッドでこれを行う必要があります。すべてのサービス プロバイダーが登録されるまで、ブート メソッドは実行されません。これは、すべてのサービスにアクセスできることを意味します。
<?phpnamespace App\Providers;use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider{ // Other Service Provider Properties... /** * Register any other events for your application. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); view()->composer('view', function () { // }); }}
タイプ ヒントを使用して、サービス プロバイダーのブート メソッドの依存関係を識別できます。サービス コンテナは、必要な依存関係を自動的に挿入します。
use Illuminate\Contracts\Routing\ResponseFactory;public function boot(ResponseFactory $factory){ $factory->macro('caps', function ($value)){ // };}
すべてのサービス プロバイダーは、config/app.php 構成ファイルに登録されます。このファイルには、すべてのサービス プロバイダーの名前をリストするプロバイダー配列が含まれています。デフォルトでは、Laravel のコア サービスはこの配列に登録されます。これらのプロバイダーは、メール、キュー、キャッシュなどの Laravel のコアコンポーネントを有効にします。
この配列に登録済みプロバイダーを追加できます:
'providers' => [ // Other Service Providers App\Providers\AppServiceProvider::class,],
プロバイダーがサービス コンテナーにバインディングを登録するだけの場合 特定の情報をお持ちの場合は、これらのサービスが実際に必要な場合にのみ登録されるように、登録を延期することを選択できます。登録を遅らせると、アプリケーションのパフォーマンスが向上する可能性があります。すべてのリクエストでファイル システムを通じてロードされるわけではないためです。
プロバイダーの読み込みを遅延するには、プロバイダー クラスで defer 属性を true に設定し、provides メソッドを定義します。 Provides メソッドは、プロバイダーによって登録されたサービス コンテナのバインディングを返します。
<?phpnamespace App\Providers;use Riak\Connection;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider{ /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Register the service provider. * * @return void */ public function register() { $this->app-singleton(Connection::class, function ($app) { return new Connection($app['config']['riak']); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return [Connection::class]; }}
Laravel は、すべての遅延読み込みサービス プロバイダーのサービス リストとサービス プロバイダーのクラス名をコンパイルして保存します。その後、laravel はサービスの 1 つを解決しようとしたときにのみサービスプロバイダーをロードします。