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