Contractとは
Laravelの「Contracts」は、フレームワークが提供するコアサービスを定義するインターフェースのセットです。例えば、Illuminate\Contracts\Queue\Queue Contractはジョブのキューイングに必要なメソッドを定義し、Illuminate\Contracts\Mail\Mailer Contractはメール送信に必要なメソッドを定義しています。
各Contractにはフレームワークが提供する対応する実装があります。例えば、Laravelはさまざまなドライバーのキュー実装と、Symfony Mailerを使ったメーラー実装を提供しています。
すべてのLaravel Contractsは専用のGitHubリポジトリにあります。これはすべての利用可能なContractへのクイックリファレンスを提供し、Laravelサービスと連携するパッケージを構築する際に利用できる単一の分離されたパッケージです。
Contractはただのインターフェースです。PHPのインターフェースと全く同じ仕組みで動作します。Laravelはこのインターフェースへの実装を提供し、サービスコンテナを通じて注入します。
ContractとFacadeの違い
ファサードとヘルパー関数は、サービスコンテナからContractを型ヒントで解決する必要なく、Laravelのサービスを簡単に利用する方法を提供しています。ほとんどの場合、各ファサードには対応するContractがあります。 ファサードとContractの主な違いは次のとおりです。Contractをいつ使うか
ContractとFacadeのどちらを使うかは、個人の好みや開発チームの好みによります。ContractとFacadeはどちらも堅牢でテストしやすいLaravelアプリケーションを作成するために使えます。ContractとFacadeは相互に排他的ではありません。アプリケーションの一部ではFacadeを使い、他の部分ではContractに依存することも可能です。 特にContractが有用な場面は次のとおりです。- 複数のPHPフレームワークと連携するパッケージを構築する場合 —
illuminate/contractsパッケージを使ってLaravelサービスとの連携を定義することで、composer.jsonにLaravelの具体的な実装を要求せずに済みます。 - 依存を明示的にしたい場合 — コンストラクターを見るだけでクラスが何に依存しているか一目でわかります。
- 実装を差し替えたい場合 — サービスコンテナを通じて別の実装に差し替えることが容易になります。
Contractの使い方
Contractの実装を取得するにはどうすればよいでしょうか。実はとても簡単です。 コントローラー、イベントリスナー、ミドルウェア、キュージョブ、ルートクロージャなど、Laravelの多くの種類のクラスはサービスコンテナを通じて解決されます。そのため、Contractの実装を取得するには、解決されているクラスのコンストラクターでインターフェースを「型ヒント」するだけです。 例えば、次のイベントリスナーを見てください。カスタムContractの作成
独自のContractを作成することで、アプリケーションのコンポーネント間の依存を明確にできます。1
インターフェースを定義する
app/Contracts ディレクトリにインターフェースを作成します。2
実装クラスを作成する
Contractを実装するクラスを作成します。
3
サービスプロバイダでバインドする
サービスプロバイダでContractと実装をバインドします。
4
型ヒントで注入を受け取る
コントローラーや他のクラスのコンストラクターで型ヒントします。
Stripe から別のプロバイダに切り替える場合も、バインディングを1か所変更するだけで対応でき、コントローラーのコードは変更不要です。
主要なContract一覧
よく使うContractとその対応するファサードの対応表です(一部抜粋)。
すべてのContractの一覧はilluminate/contractsリポジトリで確認できます。
次のステップ
ファサード
ファサードの仕組みとテスト方法を確認します。