契約
イントロダクション
Laravelの「契約(contracts)」は、フレームワークが提供するコアサービスを定義するインターフェイスのセットです。たとえば、Illuminate\Contracts\Queue\Queue契約はジョブをキューに入れるために必要なメソッドを定義し、Illuminate\Contracts\Mail\Mailer契約は電子メールを送信するために必要なメソッドを定義します。
各契約には、フレームワークによって提供される対応する実装があります。たとえば、Laravelはさまざまなドライバを持つキュー実装と、Symfony Mailerを利用したメーラー実装を提供しています。
Laravelのすべての契約は、独自のGitHubリポジトリにあります。これにより、利用可能なすべての契約のクイックリファレンスポイントと、Laravelサービスと連携するパッケージを構築する際に利用できる、単一の疎結合パッケージが提供されます。
契約とファサード
Laravelのファサードとヘルパ関数は、サービスコンテナから契約をタイプヒントして依存解決する必要なく、Laravelのサービスを利用する簡単な方法を提供します。ほとんどの場合、各ファサードには同等の契約があります。
クラスのコンストラクタでrequireする必要がないファサードとは異なり、契約を使用すると、クラスの明示的な依存関係を定義できます。一部の開発者は、この方法で依存関係を明示的に定義することを好み、したがって契約を使用することを好みますが、他の開発者はファサードの利便性を享受しています。一般的に、ほとんどのアプリケーションは開発中に問題なくファサードを使用できます。
契約を使用するケース
契約とファサードのどちらを使用するかの決定は、個人の好みと開発チームの好みに帰着します。契約とファサードの両方を使用して、堅牢で十分にテストされたLaravelアプリケーションを作成できます。契約とファサードは相互に排他的ではありません。アプリケーションの一部はファサードを使用し、他の部分は契約に依存する場合があります。クラスの責任を集中させている限り、契約とファサードの使用の間に実用的な違いはほとんどありません。
一般的に、ほとんどのアプリケーションは開発中に問題なくファサードを使用できます。複数のPHPフレームワークと統合するパッケージを構築している場合は、illuminate/contractsパッケージを使用して、パッケージのcomposer.jsonファイルにLaravelの具象実装を要求する必要なく、Laravelのサービスとの統合を定義できます。
契約の使用方法
では、どうすれば契約の実装を取得できるのでしょうか?実はとても簡単です。
コントローラ、イベントリスナ、ミドルウェア、キュージョブ、さらにはルートクロージャなど、Laravelの多くの種類のクラスは、サービスコンテナを介して依存解決されます。したがって、契約の実装を取得するには、依存解決されるクラスのコンストラクタでインターフェイスを「タイプヒント」するだけです。
たとえば、次のイベントリスナを見てください。
1<?php 2 3namespace App\Listeners; 4 5use App\Events\OrderWasPlaced; 6use App\Models\User; 7use Illuminate\Contracts\Redis\Factory; 8 9class CacheOrderInformation10{11 /**12 * Create a new event handler instance.13 */14 public function __construct(15 protected Factory $redis,16 ) {}17 18 /**19 * Handle the event.20 */21 public function handle(OrderWasPlaced $event): void22 {23 // ...24 }25}
イベントリスナが依存解決されると、サービスコンテナはクラスのコンストラクタのタイプヒントを読み取り、適切な値を注入します。サービスコンテナへの登録について詳しく知るには、そのドキュメントを確認してください。
契約リファレンス
この表は、すべてのLaravel契約とそれに対応するファサードのクイックリファレンスです。