Documentation Index
Fetch the complete documentation index at: https://kawax.biz/llms.txt
Use this file to discover all available pages before exploring further.
ファサードとは
ファサードは、アプリケーションのサービスコンテナで利用可能なクラスへの「静的」なインターフェースを提供します。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のモックインスタンスが返されます。ファサードは実際にサービスコンテナによって解決・管理されるため、通常の静的クラスよりもはるかにテストしやすいです。
| メソッド | 説明 |
|---|---|
shouldReceive('method') | メソッドが呼ばれることを期待する |
once() | 1回だけ呼ばれることを期待する |
times(n) | n回呼ばれることを期待する |
with(args) | 特定の引数で呼ばれることを期待する |
andReturn(value) | 指定した値を返す |
andReturnNull() | nullを返す |
主要なファサード一覧
よく使うファサードとその実体クラス、サービスコンテナのバインディング名の対応表です。| ファサード | クラス | バインディング |
|---|---|---|
App | Illuminate\Foundation\Application | app |
Auth | Illuminate\Auth\AuthManager | auth |
Cache | Illuminate\Cache\CacheManager | cache |
Config | Illuminate\Config\Repository | config |
Cookie | Illuminate\Cookie\CookieJar | cookie |
Crypt | Illuminate\Encryption\Encrypter | encrypter |
DB | Illuminate\Database\DatabaseManager | db |
Event | Illuminate\Events\Dispatcher | events |
File | Illuminate\Filesystem\Filesystem | files |
Gate | Illuminate\Contracts\Auth\Access\Gate | — |
Hash | Illuminate\Contracts\Hashing\Hasher | hash |
Http | Illuminate\Http\Client\Factory | — |
Log | Illuminate\Log\LogManager | log |
Mail | Illuminate\Mail\Mailer | mailer |
Notification | Illuminate\Notifications\ChannelManager | — |
Queue | Illuminate\Queue\QueueManager | queue |
RateLimiter | Illuminate\Cache\RateLimiter | — |
Redirect | Illuminate\Routing\Redirector | redirect |
Request | Illuminate\Http\Request | request |
Route | Illuminate\Routing\Router | router |
Schema | Illuminate\Database\Schema\Builder | — |
Session | Illuminate\Session\SessionManager | session |
Storage | Illuminate\Filesystem\FilesystemManager | filesystem |
URL | Illuminate\Routing\UrlGenerator | url |
Validator | Illuminate\Validation\Factory | validator |
View | Illuminate\View\Factory | view |
次のステップ
Contracts(契約)
ファサードと対をなすContractsの概念と使い分けを学びます。