Readouble

Laravel 5.1 サービスプロバイダー

イントロダクション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, middleware, 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.

サービスプロバイダーの記述Writing Service Providers

全てのサービスプロバイダーは、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/{{version}}/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

既に説明した通り、registerメソッドの中ではサービスコンテナに何かを結合することだけを行わなければなりません。イベントリスナーやルート、その他のどんな作業もregisterメソッドの中では決して行ってはいけません。これを守らないと、サービスプロバイダーがまだロードしていないサービスを意図せず使ってしまう羽目になるでしょう。As mentioned previously, within the register method, you should only bind things into the service container[/docs/{{version}}/container]. You should never attempt to register any event listeners, routes, or any other piece of functionality within the register method. Otherwise, you may accidently use a service that is provided by a service provider which has not loaded yet.

では、基本的なプロバイダーを見てみましょう。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(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, check out its documentation[/docs/{{version}}/container].

BootメソッドThe Boot Method

ではイベントリスナーをサービスプロバイダーで登録する必要がある場合は、どうすればよいのでしょうか? bootメソッドの中で行ってください。このメソッドは、他の全サービスプロバイダーが登録し終えてから呼び出されます。つまりフレームワークにより登録された、他のサービス全てにアクセスできるのです。So, what if we need to register a view composer 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 Illuminate\Support\ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * サービス起動の登録後に、実行される
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('view', function () {
            //
        });
    }

    /**
     * コンテナへの結合登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

bootメソッドの依存注入Boot Method Dependency Injection

bootメソッドでは依存をタイプヒントにより指定可能です。サービスコンテナは必要な依存を自動的に注入してくれます。We are able to type-hint dependencies for our boot method. The service container[/docs/{{version}}/container] will automatically inject any dependencies you need:

use Illuminate\Contracts\Routing\ResponseFactory;

public function boot(ResponseFactory $factory)
{
    $factory->macro('caps', function ($value) {
        //
    });
}

プロバイダーの登録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::class,
],

遅延プロバイダーDeferred Providers

もし皆さんのプロバイダーが、サービスコンテナへコンテナ結合を登録するだけであるなら、その結合が実際に必要になるまで登録を遅らせる方が良いでしょう。こうしたプロバイダーのローディングを遅らせるのは、リクエストがあるたびにファイルシステムからロードされなくなるため、アプリケーションのパフォーマンスを向上させます。If your provider is only registering bindings in the service container[/docs/{{version}}/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.

章選択

設定

明暗テーマ
light_mode
dark_mode
brightness_auto システム設定に合わせる
テーマ選択
photo_size_select_actual デフォルト
photo_size_select_actual モノクローム(白黒)
photo_size_select_actual Solarized風
photo_size_select_actual GitHub風(青ベース)
photo_size_select_actual Viva(黄緑ベース)
photo_size_select_actual Happy(紫ベース)
photo_size_select_actual Mint(緑ベース)
コードハイライトテーマ選択

明暗テーマごとに、コードハイライトのテーマを指定できます。

テーマ配色確認
スクリーン表示幅
640px
80%
90%
100%

768px以上の幅があるときのドキュメント部分表示幅です。

インデント
無し
1rem
2rem
3rem
原文確認
原文を全行表示
原文を一行ずつ表示
使用しない

※ 段落末のEボタンへカーソルオンで原文をPopupします。

Diff表示形式
色分けのみで区別
行頭の±で区別
削除線と追記で区別

※ [tl!…]形式の挿入削除行の表示形式です。

テストコード表示
両コード表示
Pestのみ表示
PHPUnitのみ表示
OS表示
全OS表示
macOSのみ表示
windowsのみ表示
linuxのみ表示
和文変換

対象文字列と置換文字列を半角スペースで区切ってください。(最大5組各10文字まで)

本文フォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

コードフォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

保存内容リセット

localStrageに保存してある設定項目をすべて削除し、デフォルト状態へ戻します。

ヘッダー項目移動

キーボード操作