イントロダクションIntroduction
サービスプロバイダーは、Laravelアプリケーション全部の初期起動処理の中心部です。皆さんのアプリケーションと同様に、Laravelの全コアサービスも、サービスプロバイダーを通じて初期起動処理を行っています。Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services are bootstrapped via service providers.
ところで、「初期起動処理」とは何を意味しているのでしょうか?サービスコンテナの結合やイベントリスナー、フィルター、それにルートなどを登録することを一般的に意味しています。サービスプロバイダーは、アプリケーション設定の中心部です。But, what do we mean by "bootstrapped"? In general, we mean registering things, including registering service container bindings, event listeners, filters, and even routes. Service providers are the central place to configure your application.
Laravelに含まれているconfig/app.php
ファイルを開けば、providers
配列が見つかるでしょう。そこにある全サービスプロバイダークラスが、アプリケーションのためにロードされます。もちろん、ほとんどのプロバイダーは、全てのリクエストで必ずロードされるとは限らず、そのプロバイダーが提供するサービスが必要なときにのみロードされる、「遅延」プロバイダーです。If you open the config/app.php
file included with Laravel, you will see a providers
array. These are all of the service provider classes that will be loaded for your application. Of course, many of them are "deferred" providers, meaning they will not be loaded on every request, but only when the services they provide are actually needed.
この概論では、自分のサービスプロバイダーの書き方と、Laravelアプリケーションに登録する方法を学びます。In this overview you will learn how to write your own service providers and register them with your Laravel application.
プロバイダーの基本サンプルBasic Provider Example
全てのサービスプロバイダーは、Illuminate\Support\ServiceProvider
クラスを拡張します。この抽象クラスは、皆さんのプロバイダーの中にregister
メソッドだけ、最低でも定義することを求めています。register
メソッドの中では、サービスコンテナへの登録だけを行わなくてはなりません。他のイベントリスナーやルート、その他の機能の一欠片でも、register
メソッドの中で登録しようとしてはいけません。All service providers extend the Illuminate\Support\ServiceProvider
class. This abstract class requires that you define at least one method on your provider: register
. Within the register
method, you should only bind things into the service container[/docs/master/container]. You should never attempt to register any event listeners, routes, or any other piece of functionality within the register
method.
make:provider
Artisanコマンドラインにより、簡単に新しいプロバイダーが生成できます。The Artisan CLI can easily generate a new provider via the make:provider
command:
php artisan make:provider RiakServiceProvider
registerメソッドThe Register Method
では、プロバイダーの基本サンプルを見ていきましょう。Now, let's take a look at a basic service provider:
<?php namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
class RiakServiceProvider extends ServiceProvider {
/**
* コンテナへの結合登録
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function($app)
{
return new Connection($app['config']['riak']);
});
}
}
このサービスプロバイダーでは、register
メソッドだけが定義されています。そして、サービスコンテナにRiak\Contracts\Connection
の実装を定義しています。サービスコンテナがどのように動作するのか理解できなくても、心配ありません。すぐに学習することになります。This service provider only defines a register
method, and uses that method to define an implementation of Riak\Contracts\Connection
in the service container. If you don't understand how the service container works, don't worry, we'll cover that soon[/docs/master/container].
このクラスは、App\Providers
の名前空間にあります。Laravelのデフォルトのサービスプロバイダー設置場所だからです。しかし、ご希望であれば変更可能です。サービスプロバイダーは、Composerがオートロード可能であれば、どこにでも自由に配置できます。This class is namespaced under App\Providers
since that is the default location for service providers in Laravel. However, you are free to change this as you wish. Your service providers may be placed anywhere that Composer can autoload them.
bootメソッドThe Boot Method
では、イベントリスナーをサービスプロバイダーで登録する必要がある場合は、どうすればよいのでしょうか?boot
メソッドの中で行ってください。このメソッドは、他の全サービスプロバイダーが登録し終えてから呼び出されます。つまり、フレームワークにより登録された、他のサービス全部にアクセスできるのです。So, what if we need to register an event listener within our service provider? This should be done within the boot
method. This method is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework.
<?php namespace App\Providers;
use Event;
use Illuminate\Support\ServiceProvider;
class EventServiceProvider extends ServiceProvider {
/**
* サービス起動の登録後に、実行される
*
* @return void
*/
public function boot()
{
Event::listen('SomeEvent', 'SomeEventHandler');
}
/**
* コンテナへの結合を登録する
*
* @return void
*/
public function register()
{
//
}
}
boot
メソッドでは、依存をタイプヒントにより指定可能です。サービスコンテナは必要な依存を自動的に注入してくれます。We are able to type-hint dependencies for our boot
method. The service container will automatically inject any dependencies you need:
use Illuminate\Contracts\Events\Dispatcher;
public function boot(Dispatcher $events)
{
$events->listen('SomeEvent', 'SomeEventHandler');
}
プロバイダーの登録Registering Providers
全てのサービスプロバイダーは、config/app.php
設定ファイルで登録されています。このファイルには、サービスプロバーダーの名前がリストされ、登録することができるproviders
配列が含まれています。この配列にはデフォルトで、コアのサービスプロバイダーが登録されています。これらのプロバイダーは、メイラー、キュー、キャッシュなどのLaravelコアコンポーネントの初期起動を行っています。All service providers are registered in the config/app.php
configuration file. This file contains a providers
array where you can list the names of your service providers. By default, a set of Laravel core service providers are listed in this array. These providers bootstrap the core Laravel components, such as the mailer, queue, cache, and others.
プロバイダーに登録するには、この配列に追加するだけです。To register your provider, simply add it to the array:
'providers' => [
// 他のサービスプロバイダー
'App\Providers\AppServiceProvider',
],
遅延プロバイダーDeferred Providers
もしも皆さんのプロバイダーが、サービスコンテナーへ結合を登録するだけでしたら、登録する結合が実際に必要になるまで、登録を遅らせる方が良いでしょう。こうしたプロバイダーのローディングを遅らせるのは、リクエストがあるたびにファイルシステムからロードされなくなるため、アプリケーションのパフォーマンスを向上させます。If your provider is only registering bindings in the service container[/docs/master/container], you may choose to defer its registration until one of the registered bindings is actually needed. Deferring the loading of such a provider will improve the performance of your application, since it is not loaded from the filesystem on every request.
プロバイダーを遅延ロードするには、defer
プロパティーにtrue
をセットし、provides
メソッドを定義します。provides
メソッドはプロバイダーで登録する、サービスコンテナ結合を返します。To defer the loading of a provider, set the defer
property to true
and define a provides
method. The provides
method returns the service container bindings that the provider registers:
<?php namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
class RiakServiceProvider extends ServiceProvider {
/**
* プロバイダーのローディングを遅延させるフラッグ
*
* @var bool
*/
protected $defer = true;
/**
* サービスプロバーダーの登録
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function($app)
{
return new Connection($app['config']['riak']);
});
}
/**
* このプロバイダーにより提供されるサービス
*
* @return array
*/
public function provides()
{
return ['Riak\Contracts\Connection'];
}
}
Laravelは遅延サービスプロバイダーが提示した、全サービスのリストをコンパイルし、サービスプロバイダーのクラス名と共に保存します。その後、登録されているサービスのどれか一つを依存解決する必要が起きた時のみ、Laravelはそのサービスプロバイダーをロードします。Laravel compiles and stores a list of all of the services supplied by deferred service providers, along with the name of its service provider class. Then, only when you attempt to resolve one of these services does Laravel load the service provider.