Skip to main content

ファサードとは

ファサードは、アプリケーションのサービスコンテナで利用可能なクラスへの「静的」なインターフェースを提供します。Laravelにはほぼすべての機能にアクセスできる多くのファサードが同梱されています。 Laravelのファサードはサービスコンテナ内の実体クラスへの「静的プロキシ」として機能し、従来の静的メソッドよりもテストしやすく柔軟性を保ちながら、簡潔で表現力豊かな構文を提供します。 すべてのLaravelファサードは Illuminate\Support\Facades 名前空間に定義されています。
ファサードの仕組みを完全に理解していなくても問題ありません。まずは使い方を覚えて、Laravelを学び続けましょう。

ファサードの仕組み

Laravelアプリケーションでは、ファサードはコンテナからオブジェクトへのアクセスを提供するクラスです。この仕組みは Facade クラスによって実現されています。Laravelのすべてのファサード、およびカスタムファサードは、基底クラス Illuminate\Support\Facades\Facade を継承します。 Facade 基底クラスは __callStatic() マジックメソッドを使って、ファサードへの呼び出しをコンテナから解決されたオブジェクトへ委譲します。
ファイルの先頭で Cache ファサードをインポートしています。このファサードは Illuminate\Contracts\Cache\Factory インターフェースの実装へのアクセスをプロキシします。ファサードを使った呼び出しはすべて、Laravelのキャッシュサービスの内部インスタンスに渡されます。 Illuminate\Support\Facades\Cache クラスを見ると、静的メソッド get は存在しません。
Cache ファサードは基底 Facade クラスを継承し、getFacadeAccessor() メソッドを定義しています。このメソッドはサービスコンテナのバインディング名を返します。ユーザーが Cache ファサードの静的メソッドを呼び出すと、Laravelはサービスコンテナから cache バインディングを解決し、そのオブジェクトに対してリクエストされたメソッド(この場合 get)を実行します。

ファサードを使う場面・使わない場面

ファサードのメリット

ファサードには多くのメリットがあります。手動で注入・設定しなければならない長いクラス名を覚えることなく、Laravelの機能を使える簡潔で覚えやすい構文を提供します。また、PHPのダイナミックメソッドの独自の使い方により、テストが容易です。

スコープクリープに注意する

ファサードを使う際の主な危険性はクラスの「スコープクリープ」です。ファサードは使いやすく注入を必要としないため、クラスが肥大化して多くのファサードを使い続けてしまいがちです。依存注入を使えば、大きなコンストラクターが視覚的なフィードバックを与えてくれます。ファサードを使う場合は、クラスのサイズに注意して責務の範囲を狭く保ちましょう。
クラスが大きくなりすぎたと感じたら、複数の小さなクラスに分割することを検討してください。

ファサード vs. 依存注入

依存注入の主なメリットの一つは、注入されたクラスの実装を差し替えられることです。これはテスト時に役立ちます。モックやスタブを注入して、スタブに対してさまざまなメソッドが呼ばれたことをアサートできます。 真に静的なクラスメソッドはモックやスタブにできないのが通常ですが、ファサードはダイナミックメソッドを使ってサービスコンテナから解決されたオブジェクトへのメソッド呼び出しをプロキシするため、注入されたクラスインスタンスをテストするのと同じようにファサードをテストできます。
このルートに対して、次のテストを書いて Cache::get が期待する引数で呼び出されたことを検証できます。

ファサード vs. ヘルパー関数

ファサードに加えて、Laravelはビューの生成、イベントの発火、ジョブのディスパッチ、HTTPレスポンスの送信など、一般的なタスクを実行できる「ヘルパー」関数を提供しています。多くのヘルパー関数は対応するファサードと同じ機能を実行します。
ファサードとヘルパー関数の間には実質的な違いはありません。ヘルパー関数を使っている場合でも、対応するファサードと同じようにテストできます。

リアルタイムファサード

リアルタイムファサードを使うと、アプリケーション内の任意のクラスをファサードとして扱えます。使い方を説明するために、まずリアルタイムファサードを使わないコードを見てみましょう。 例えば、Podcast モデルに publish メソッドがあるとします。ただし、ポッドキャストを公開するには Publisher インスタンスを注入する必要があります。
リアルタイムファサードを使うと、同じテスト容易性を維持しながら Publisher インスタンスを明示的に渡す必要がなくなります。リアルタイムファサードを生成するには、インポートするクラスの名前空間に Facades というプレフィックスを付けます。
リアルタイムファサードが使われると、Facades プレフィックスの後に現れるインターフェースまたはクラス名の部分を使ってサービスコンテナからパブリッシャーの実装が解決されます。
リアルタイムファサードは、テスト時のモックを簡単にしながら、引数として渡す必要をなくしたい場合に便利です。

ファサードのテスト

ファサードをテストするには shouldReceive メソッドを使います。これにより、Mockeryのモックインスタンスが返されます。ファサードは実際にサービスコンテナによって解決・管理されるため、通常の静的クラスよりもはるかにテストしやすいです。
よく使うモックメソッドは次のとおりです。

主要なファサード一覧

よく使うファサードとその実体クラス、サービスコンテナのバインディング名の対応表です。

次のステップ

Contracts(契約)

ファサードと対をなすContractsの概念と使い分けを学びます。
最終更新日 2026年4月9日