Laravel 4.2 ファサード

イントロダクション

ファサードはアプリケーションのIoCコンテナに用意したクラスに「静的」なインターフェイスを提供してくれます。Laravelは多くのファサードを使用していますが、多分皆さんはご存じないまま使用されていることでしょう!Laravelの「ファサード(facade)」は、IoCコンテナー下で動作しているクラスに対し、"static proxies"として動作しています。これにより伝統的な静的メソッドよりも、簡潔で、テストの行いやすさと柔軟性を保ちながらも、記述的な書き方が行えます。

自分のアプリケーションやパッケージでも時々ファサードを作成したくなると思います。ですからコンセプトと、開発方法、クラスの使い方を説明していきます。

注目:ファサードを学び始める前に、LaravelのIocコンテナに親しんでおくことを強くおすすめします。

解説

Laravelアプリケーションに関する文脈では、ファサードはコンテナを通じてオブジェクトにアクセス方法を提供するクラスのことです。Facadeクラス中のメカニズムでこれを行なっています。Laravelのファサードと皆さんが作成したカスタムファサードは、Facadeクラスを拡張します。

ファサードクラスで実装する必要があるのはgetFacadeAccessorだけです。getFacadeAccessorメソッドの役目はコンテナを通じたインスタンスの解決に何を使用するかを定義することです。Facade基本クラスは__callStatic()マジックメソッドを使用し、あなたのファサードからの呼び出しをインスタンス化を解決したオブジェクトへと届けます。

Cache::getのようにファサードの呼び出しが行われると、LaravelはIoCコンテナでCacheマネージャーを解決し、そのクラスのgetメソッドを呼び出します。技術的な言い方をすれば、Laravelのファサードは、サービスローケーターとしてのLaravelのIoCコンテナを使用した、使いやすい記法のことです。

実際の使用

下の例では、Laravelのキャッシュシステムを呼び出しています。これを読むと、一見Cacheクラスのstaticなgetメソッドが呼び出されていのだと考えてしまうことでしょう。

$value = Cache::get('key');

ところが、Illuminate\Support\Facades\Cacheクラスを見てもらえば、staticのgetメソッドは存在していないことが分かります。

class Cache extends Facade {

    /**
     * コンポーネントの登録名を取得する
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'cache'; }

}

Cacheクラスは基本のFacadeクラスを拡張し、getFacadeAccessor()メソッドを定義しています。思い出してください。このメソッドの仕事はIoCで結合した名前をリターンすることでした。

ユーザーがCacheファサードのどのstaticメソッドを利用しようと、LaravelはIoCコンテナからcacheに結び付けられたインスタンスを解決し、要求されたメソッドを(この場合はgetです)そのオブジェクトに対し実行します。

ですから、Cache::getの呼び出しは以下のように書き直すこともできます。

$value = $app->make('cache')->get('key');

ファサードの作成

ファサードを作成するとアプリケーションやパッケージをシンプルにすることができます。必要なのは3つだけです。

例を見てください。PaymentGateway\Paymentクラスを定義しています。

namespace PaymentGateway;

class Payment {

    public function process()
    {
        //
    }

}

このクラスはapp/modelsディレクトリーの中に設置されることでしょう。もしくは、Composerがオートロードできるディレクトリーの中に設置します。

IoCコンテナでこのクラスのインスタンス化を解決することが必要です。では、バインディングを追加しましょう。

App::bind('payment', function()
{
    return new \PaymentGateway\Payment;
});

このバインディングコードを設置する良い場所は、新しいPaymentServiceProviderという名前のサービスプロバイダーを作成し、registerメソッドにこのコードを追加します。それから、app/config/app.php設定ファイルでこのサービスプロバイダーをLaravelがロードするように設定します。

次に、ファサードクラスを作成しましょう。

use Illuminate\Support\Facades\Facade;

class Payment extends Facade {

    protected static function getFacadeAccessor() { return 'payment'; }

}

最後に、お望みならば、app/config/app.php設定ファイルのaliases配列にファサードクラスのエイリアスを追加することもできます。これで、Paymentクラスのインスタンス上でprocessメソッドを呼び出すことができます。

Payment::process();

オートローディングエイリアスの注意点

PHPが未定義のタイプヒントをオートロードしないため、aliases配列中のクラスが、使用できない場合があります。もし、\ServiceWrapper\ApiTimeoutExceptionApiTimeoutExceptionというエイリアス名で定義し、\ServiceWrapper外の名前空間でcatch(ApiTimeoutException $e)しても、投げられたその例外は捕捉されません。似たような問題は、エイリアスされたクラスへのタイプヒントを持つモデルでも、見かけられます。解決するには、そのようなエイリアスの参照に先立ち、それぞれのファイルの先頭で、必要なタイプヒントをuseで指定しておく方法しかありません。

ファサードのモック

ファサードがどうしてこのように動作するのかという理由の重要な一面が、ユニットテストです。実際、ファサードが存在している一番大きな理由がテストの行いやすさです。詳細はドキュメントのファサードのモックの章をご覧ください。

ファサードクラス一覧

以下は全ファサードと、実際のクラスの一覧です。これは特定のファサードを元にし、APIドキュメントを素早く探したい場合に便利な道具になります。IoC結合キーも含んでいますので、応用して下さい。

ファサード クラス IoC結合
App Illuminate\Foundation\Application app
Artisan Illuminate\Console\Application artisan
Auth Illuminate\Auth\AuthManager auth
Auth (インスタンス) Illuminate\Auth\Guard
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Cache Illuminate\Cache\Repository cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (インスタンス) Illuminate\Database\Connection
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Form Illuminate\Html\FormBuilder form
Hash Illuminate\Hashing\HasherInterface hash
HTML Illuminate\Html\HtmlBuilder html
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Paginator Illuminate\Pagination\Factory paginator
Paginator (インスタンス) Illuminate\Pagination\Paginator
Password Illuminate\Auth\Reminders\PasswordBroker auth.reminder
Queue Illuminate\Queue\QueueManager queue
Queue (インスタンス) Illuminate\Queue\QueueInterface
Queue (ベースクラス) Illuminate\Queue\Queue
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Support\Facades\Response
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint
Session Illuminate\Session\SessionManager session
Session (インスタンス) Illuminate\Session\Store
SSH Illuminate\Remote\RemoteManager remote
SSH (インスタンス) Illuminate\Remote\Connection
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator (インスタンス) Illuminate\Validation\Validator
View Illuminate\View\Factory view
View (インスタンス) Illuminate\View\View

ドキュメント章別ページ

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)へ移動

その他

?

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