コントラクト
概要
Laravelの「コントラクト」は、フレームワークが提供するコアサービスを定義するインターフェースのセットです。たとえば、Illuminate\Contracts\Queue\Queueコントラクトは、ジョブをキューイングするために必要なメソッドを定義し、Illuminate\Contracts\Mail\Mailerコントラクトは、電子メールを送信するために必要なメソッドを定義します。
各コントラクトには、フレームワークによって提供される対応する実装があります。たとえば、Laravelはさまざまなドライバを使用したキューの実装と、Symfony Mailerを搭載したメーラーの実装を提供します。
Laravelのすべてのコントラクトは、独自のGitHubリポジトリに存在します。これにより、利用可能なすべてのコントラクトへのクイックリファレンスポイントと、Laravelサービスと対話するパッケージを構築する際に利用できる単一の分離されたパッケージが提供されます。
コントラクト vs ファサード
Laravelのファサードとヘルパー関数は、サービスコンテナからコントラクトをタイプヒントで解決する必要なく、Laravelのサービスを利用する簡単な方法を提供します。ほとんどの場合、各ファサードには同等のコントラクトがあります。
クラスのコンストラクタで必要としないファサードとは異なり、コントラクトを使用すると、クラスの明示的な依存関係を定義できます。一部の開発者は、この方法で依存関係を明示的に定義することを好み、そのためコントラクトを使用することを好みますが、他の開発者はファサードの利便性を享受しています。一般に、ほとんどのアプリケーションは開発中に問題なくファサードを使用できます。
コントラクトを使用する場面
コントラクトまたはファサードを使用するという決定は、個人の好みと開発チームの好みに委ねられます。コントラクトとファサードの両方を使用して、堅牢で十分にテストされたLaravelアプリケーションを作成できます。コントラクトとファサードは相互に排他的ではありません。アプリケーションの一部ではファサードを使用し、他の部分ではコントラクトに依存する場合があります。クラスの責任を集中させていれば、コントラクトとファサードの使用に実質的な違いはほとんどないでしょう。
一般に、ほとんどのアプリケーションは開発中に問題なくファサードを使用できます。複数のPHPフレームワークと統合するパッケージを構築する場合は、パッケージのcomposer.jsonファイルでLaravelの具体的な実装を必要とせずに、Laravelのサービスとの統合を定義するためにilluminate/contractsパッケージを使用することをお勧めします。
コントラクトの使用方法
では、コントラクトの実装をどのように取得するのでしょうか?それは実際には非常に簡単です。
Laravelの多くの種類のクラスは、コントローラ、イベントリスナー、ミドルウェア、キューイングされたジョブ、さらにはルートクロージャを含む、サービスコンテナを通じて解決されます。したがって、コントラクトの実装を取得するには、解決されるクラスのコンストラクタでインターフェースを「タイプヒント」するだけです。
たとえば、このイベントリスナーを見てみましょう。
<?php namespace App\Listeners; use App\Events\OrderWasPlaced;use App\Models\User;use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{    /**     * Create a new event handler instance.     */    public function __construct(        protected Factory $redis,    ) {}     /**     * Handle the event.     */    public function handle(OrderWasPlaced $event): void    {        // ...    }}イベントリスナーが解決されると、サービスコンテナはクラスのコンストラクタのタイプヒントを読み取り、適切な値を注入します。サービスコンテナにものを登録する方法の詳細については、ドキュメントをご覧ください。
コントラクトリファレンス
この表は、すべてのLaravelコントラクトとその同等のファサードへのクイックリファレンスを提供します。