イントロダクション
ファサードはアプリケーションのサービスコンテナに登録したクラスへ、「静的」なインターフェイスを提供しています。Laravelは多くのファサードを使用していますが、多分皆さんは気が付かないまま使用していることでしょう! Laravelの「ファサード(facade)」はサービスコンテナ下で動作しているクラスに対し、"static proxy"として動作しています。これにより伝統的な静的メソッドよりも簡潔でテストの行いやすさと柔軟性を保ちながらも、記述的な書き方が行えます。
ファサードの使用
Laravelアプリケーションに関する文脈における「ファサード」とは、コンテナを通じてオブジェクトにアクセス方法を提供するクラスのことを意味します。Facade
クラス中の仕組みでこれを行なっています。Laravelのファサードと皆さんが作成するカスタムファサードは、Illuminate\Support\Facades\Facade
クラスを拡張します。
ファサードクラスで実装する必要があるのはgetFacadeAccessor
だけです。getFacadeAccessor
メソッドの役目はコンテナを通じたインスタンスの依存解決に何を使用するかを定義することです。Facade
基本クラスは__callStatic()
マジックメソッドを使用し、あなたのファサードからの呼び出しを依存解決してインスタンス化したオブジェクトへと届けます。
下の例では、Laravelのキャッシュシステムを呼び出しています。これを読むと一見、Cache
クラスのstaticなget
メソッドが呼び出されているのだと考えてしまうことでしょう。
<?php
namespace App\Http\Controllers;
use Cache;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 指定したユーザのプロフィール表示
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Cache::get('user:'.$id);
return view('profile', ['user' => $user]);
}
}
ファイルの先頭でCache
ファサードを取り込んでいることに注目です。このファサードサービスはIlluminate\Contracts\Cache\Factory
インターフェイスの裏にある実装へアクセスするプロキシとして動作します。ファサードを使ったメソッド呼び出しは、裏のLaravelのキャッシュサービスの実装へ渡されます。
そのためIlluminate\Support\Facades\Cache
クラスを見てもらえば、staticのget
メソッドは存在していないことが分かります。
class Cache extends Facade
{
/**
* コンポーネントの登録名を取得
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
Cache
ファサードはベースのFacade
クラスを拡張し、getFacadeAccessor()
メソッドを定義しています。思い出してください。このメソッドの仕事はサービスコンテナの結合名を返すことでした。ユーザがCache
ファサードのどのstaticメソッドを利用しようと、Laravelはサービスコンテナからcache
に結び付けられたインスタンスを依存解決し、要求されたメソッドを(この場合はget
)そのオブジェクトに対し実行します。
ファサードクラス一覧
以下は全ファサードと実際のクラスの一覧です。これは特定のファサードを元にし、APIドキュメントを素早く探したい場合に便利な道具になります。対応するサービスコンテナ結合キーも記載しています。