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

イントロダクション

サービスプロバイダーは、Laravelアプリケーション全体の初期起動処理の心臓部です。皆さんのアプリケーションと同様に、Laravelの全コアサービスも、サービスプロバイダーを通じて初期起動処理を行っています。

ところで、「初期起動処理」とは何を意味しているのでしょうか?サービスコンテナの結合やイベントリスナー、フィルター、それにルートなどを登録することを一般的に意味しています。サービスプロバイダーは、アプリケーション設定の中心部です。

Laravelに含まれているconfig/app.phpファイルを開けば、providers配列が見つかるでしょう。そこにある全サービスプロバイダークラスが、アプリケーションのためにロードされます。もちろん、ほとんどのプロバイダーは、全てのリクエストで必ずロードされるとは限らず、そのプロバイダーが提供するサービスが必要なときにのみロードされる、「遅延」プロバイダーです。

この概論では、サービスプロバイダーの書き方と、Laravelアプリケーションに登録する方法を学びます。

プロバイダーの基本サンプル

全てのサービスプロバイダーは、Illuminate\Support\ServiceProviderクラスを拡張します。この抽象クラスは皆さんのプロバイダーの中に、最低でもregisterメソッドだけ定義することを求めています。registerメソッドの中では、サービスコンテナへの登録だけを行わなくてはなりません。他のイベントリスナーやルート、その他の機能の一部でも、registerメソッドの中で登録しようとしてはいけません。

make:provider Artisanコマンドラインにより、簡単に新しいプロバイダーが生成できます。

php artisan make:provider RiakServiceProvider

registerメソッド

では、プロバイダーの基本サンプルを見ていきましょう。

<?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の実装を定義しています。サービスコンテナがどのように動作するのか理解できなくても、心配ありません。すぐに学習することになります。

このクラスは、App\Providersの名前空間にあります。Laravelのデフォルトのサービスプロバイダー設置場所だからです。しかし、ご希望であれば変更可能です。サービスプロバイダーは、Composerがオートロード可能であれば、どこにでも自由に配置できます。

bootメソッド

では、イベントリスナーをサービスプロバイダーで登録する必要がある場合は、どうすればよいのでしょうか?bootメソッドの中で行ってください。このメソッドは、他の全サービスプロバイダーが登録し終えてから呼び出されます。つまり、フレームワークにより登録された、他のサービス全部にアクセスできるのです。

<?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メソッドでは、依存をタイプヒントにより指定可能です。サービスコンテナは必要な依存を自動的に注入してくれます。

use Illuminate\Contracts\Events\Dispatcher;

public function boot(Dispatcher $events)
{
    $events->listen('SomeEvent', 'SomeEventHandler');
}

プロバイダーの登録

全てのサービスプロバイダーは、config/app.php設定ファイルで登録されています。このファイルには、サービスプロバイダーの名前をリストし、登録することができるproviders配列が含まれています。この配列にはデフォルトで、コアのサービスプロバイダーが登録されています。こうしたプロバイダーは、メール送信、キュー、キャッシュなどのLaravelコアコンポーネントの初期起動を行っています。

プロバイダーに登録するには、この配列に追加するだけです。

'providers' => [
    // 他のサービスプロバイダー

    'App\Providers\AppServiceProvider',
],

遅延プロバイダー

もし皆さんのプロバイダーが、サービスコンテナへ結合を登録するだけでしたら、登録する結合が実際に必要になるまで、登録を遅らせる方が良いでしょう。こうしたプロバイダーのローディングを遅らせるのは、リクエストがあるたびにファイルシステムからロードされなくなるため、アプリケーションのパフォーマンスを向上させます。

プロバイダーを遅延ロードするには、deferプロパティーにtrueをセットし、providesメソッドを定義します。providesメソッドはプロバイダーで登録する、サービスコンテナ結合を返します。

<?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はそのサービスプロバイダーをロードします。

ドキュメント章別ページ

Artisan CLI

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる