メインコンテンツまでスキップ

コントラクト

はじめに

Laravelの「コントラクト」は、フレームワークが提供するコアサービスを定義する一連のインターフェースです。たとえば、Illuminate\Contracts\Queue\Queueコントラクトは、ジョブをキューイングするために必要なメソッドを定義し、Illuminate\Contracts\Mail\Mailerコントラクトは、メールを送信するために必要なメソッドを定義します。

各コントラクトには、フレームワークによって提供される対応する実装があります。たとえば、Laravelはさまざまなドライバーを備えたキューの実装や、Symfony Mailerによって動作するメーラーの実装を提供しています。

すべてのLaravelのコントラクトは、独自のGitHubリポジトリにあります。これにより、利用可能なすべてのコントラクトの素早い参照ポイントが提供されると同時に、Laravelサービスとやり取りするパッケージを構築する際に利用できる、単一で切り離されたパッケージが提供されます。

コントラクトとファサード

Laravelのファサードとヘルパー関数は、サービスコンテナからコントラクトを型ヒントや解決する必要なしに利用する簡単な方法を提供します。ほとんどの場合、各ファサードには対応するコントラクトがあります。

ファサードは、クラスのコンストラクタでそれらを要求する必要がないため、ファサードを使用する際には、クラスの依存関係を明示的に定義することができます。一部の開発者はこの方法で依存関係を明示的に定義することを好み、そのためコントラクトを使用することを好む一方、他の開発者はファサードの利便性を楽しむことを好みます。一般的に、ほとんどのアプリケーションは開発中に問題なくファサードを使用できます。

コントラクトの使用タイミング

コントラクトまたはファサードを使用するかどうかの決定は、個人の好みや開発チームの好みにかかってきます。コントラクトとファサードの両方を使用して、堅牢でテストされたLaravelアプリケーションを作成することができます。コントラクトとファサードは相互排他的ではありません。アプリケーションの一部はファサードを使用し、他の部分はコントラクトに依存するかもしれません。クラスの責任を集中させている限り、コントラクトとファサードを使用することによる実用的な違いはほとんどありません。

一般的に、ほとんどのアプリケーションは開発中にFacadeを問題なく使用できます。複数のPHPフレームワークと統合するパッケージを構築している場合は、Laravelの具象実装をパッケージのcomposer.jsonファイルで要求する必要がないように、illuminate/contractsパッケージを使用して、Laravelのサービスとの統合を定義することができます。

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契約とそれに対応するファサードへのクイックリファレンスを提供します:

契約ファサード
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\PipelinePipeline;
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()