メインコンテンツまでスキップ
バージョン: 9.x

契約 (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 コントラクトとそれらの同等のファサードへのクイックリファレンスを提供します。

契約参考資料 ファサード
Illuminate\Contracts\Auth\Access\Authorizable  
Illuminate\Contracts\Auth\Access\GateGate
Illuminate\Contracts\Auth\Authenticatable  
Illuminate\Contracts\Auth\CanResetPassword 
Illuminate\Contracts\Auth\FactoryAuth
Illuminate\Contracts\Auth\GuardAuth::guard()
Illuminate\Contracts\Auth\PasswordBrokerPassword::broker()
Illuminate\Contracts\Auth\PasswordBrokerFactoryPassword
Illuminate\Contracts\Auth\StatefulGuard 
Illuminate\Contracts\Auth\SupportsBasicAuth 
Illuminate\Contracts\Auth\UserProvider 
Illuminate\Contracts\Bus\DispatcherBus
Illuminate\Contracts\Bus\QueueingDispatcherBus::dispatchToQueue()
Illuminate\Contracts\Broadcasting\FactoryBroadcast
Illuminate\Contracts\Broadcasting\BroadcasterBroadcast::connection()
Illuminate\Contracts\Broadcasting\ShouldBroadcast 
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow 
Illuminate\Contracts\Cache\FactoryCache
Illuminate\Contracts\Cache\Lock 
Illuminate\Contracts\Cache\LockProvider 
Illuminate\Contracts\Cache\RepositoryCache::driver()
Illuminate\Contracts\Cache\Store 
Illuminate\Contracts\Config\RepositoryConfig
Illuminate\Contracts\Console\Application 
Illuminate\Contracts\Console\KernelArtisan
Illuminate\Contracts\Container\ContainerApp
Illuminate\Contracts\Cookie\FactoryCookie
Illuminate\Contracts\Cookie\QueueingFactoryCookie::queue()
Illuminate\Contracts\Database\ModelIdentifier 
Illuminate\Contracts\Debug\ExceptionHandler 
Illuminate\Contracts\Encryption\EncrypterCrypt
Illuminate\Contracts\Events\DispatcherEvent
Illuminate\Contracts\Filesystem\CloudStorage::cloud()
Illuminate\Contracts\Filesystem\FactoryStorage
Illuminate\Contracts\Filesystem\FilesystemStorage::disk()
Illuminate\Contracts\Foundation\ApplicationApp
Illuminate\Contracts\Hashing\HasherHash
Illuminate\Contracts\Http\Kernel 
Illuminate\Contracts\Mail\MailQueueMail::queue()
Illuminate\Contracts\Mail\Mailable 
Illuminate\Contracts\Mail\MailerMail
Illuminate\Contracts\Notifications\DispatcherNotification
Illuminate\Contracts\Notifications\FactoryNotification
Illuminate\Contracts\Pagination\LengthAwarePaginator 
Illuminate\Contracts\Pagination\Paginator 
Illuminate\Contracts\Pipeline\Hub 
Illuminate\Contracts\Pipeline\Pipeline 
Illuminate\Contracts\Queue\EntityResolver 
Illuminate\Contracts\Queue\FactoryQueue
Illuminate\Contracts\Queue\Job 
Illuminate\Contracts\Queue\MonitorQueue
Illuminate\Contracts\Queue\QueueQueue::connection()
Illuminate\Contracts\Queue\QueueableCollection 
Illuminate\Contracts\Queue\QueueableEntity 
Illuminate\Contracts\Queue\ShouldQueue 
Illuminate\Contracts\Redis\FactoryRedis
Illuminate\Contracts\Routing\BindingRegistrarRoute
Illuminate\Contracts\Routing\RegistrarRoute
Illuminate\Contracts\Routing\ResponseFactoryResponse
Illuminate\Contracts\Routing\UrlGeneratorURL
Illuminate\Contracts\Routing\UrlRoutable 
Illuminate\Contracts\Session\SessionSession::driver()
Illuminate\Contracts\Support\Arrayable 
Illuminate\Contracts\Support\Htmlable 
Illuminate\Contracts\Support\Jsonable 
Illuminate\Contracts\Support\MessageBag 
Illuminate\Contracts\Support\MessageProvider 
Illuminate\Contracts\Support\Renderable 
Illuminate\Contracts\Support\Responsable 
Illuminate\Contracts\Translation\Loader 
Illuminate\Contracts\Translation\TranslatorLang
Illuminate\Contracts\Validation\FactoryValidator
Illuminate\Contracts\Validation\ImplicitRule 
Illuminate\Contracts\Validation\Rule 
Illuminate\Contracts\Validation\ValidatesWhenResolved 
Illuminate\Contracts\Validation\ValidatorValidator::make()
Illuminate\Contracts\View\Engine 
Illuminate\Contracts\View\FactoryView
Illuminate\Contracts\View\ViewView::make()