本文へ移動
Laravel Tips

コントラクト

Laravel の「コントラクト」(機能の約束事を決めたインターフェース)とは何か、ファサードとの違い、使い分け、使い方と、コントラクトとファサードの対応表を説明します。

Laravel の「コントラクト」は、フレームワークが持つ主な機能の約束事を決めた、インターフェース(クラスが守る約束事)の集まりです。たとえば、Illuminate\Contracts\Queue\Queue は、ジョブ(時間のかかる仕事)をキューに入れるために必要なメソッドを決めています。Illuminate\Contracts\Mail\Mailer は、メールを送るために必要なメソッドを決めています。

それぞれのコントラクトには、フレームワークが用意した、実際に動くクラス(実装)があります。たとえば、いろいろなドライバー(使う方式)に対応したキューの実装や、Symfony Mailer で動くメールの実装があります。

Laravel のコントラクトは、すべて、専用の GitHub のリポジトリ(illuminate/contracts)にまとまっています。使えるコントラクトを手早く調べたいときは、ここを見ます。また、このリポジトリは、それだけで使える1つのパッケージにもなっています。Laravel の機能とやり取りするパッケージを作るときに使えます。

コントラクトとファサードの違い#

ファサード(Route::get() のようにクラス名と :: で機能を呼べる窓口)やヘルパー関数を使えば、コントラクトの型を書いてサービスコンテナから取り出さなくても、Laravel の機能を使えます。たいていのファサードには、対応するコントラクトがあります。

ファサードは、クラスのコンストラクタに書かなくても使えます。それに対して、コントラクトを使うと、「このクラスは何の道具を使うか」をはっきり書けます。はっきり書くのが好きな人はコントラクトを、手軽さが好きな人はファサードを選びます。たいていのアプリは、開発のあいだずっとファサードを使っても困りません。

コントラクトを使うとき#

どちらを使うかは、自分とチームの好みで決めます。どちらでも、しっかりしたアプリを作れます。両方を混ぜてもかまいません。クラスの役目を絞ってあれば、どちらを使っても違いはほとんど出ません。

いくつもの PHP のフレームワークで使うパッケージを作るなら、illuminate/contracts パッケージが役に立ちます。Laravel の機能とのつなぎ方を、インターフェースだけで決められるからです。パッケージの composer.json に、Laravel の実装(中身のあるクラス)を入れなくて済みます。

コントラクトの使い方#

では、コントラクトの実装は、どうやって手に入れるのでしょうか。じつは、とても簡単です。

Laravel では、いろいろな種類のクラスがサービスコンテナを通して作られます。コントローラー・イベントのリスナー・ミドルウェア・キューのジョブ、ルートのクロージャ(名前のない関数)まで、そうです。だから、コントラクトの実装がほしいときは、そのクラスのコンストラクタに、インターフェースの型を書くだけで済みます。

たとえば、次のイベントのリスナーを見てください。

php
<?php

namespace App\Listeners;

use App\Events\OrderWasPlaced;
use App\Models\User;
use Illuminate\Contracts\Redis\Factory;

class CacheOrderInformation
{
    /**
     * Create the event listener.
     */
    public function __construct(
        protected Factory $redis,
    ) {}

    /**
     * Handle the event.
     */
    public function handle(OrderWasPlaced $event): void
    {
        // ...
    }
}

リスナーが作られるとき、サービスコンテナは、コンストラクタに書かれた型を読み取って、ふさわしい値を渡します。サービスコンテナへの登録のしかたは、サービスコンテナのページにあります。

コントラクトの一覧#

次の表は、Laravel のコントラクトと、同じ役目のファサードの対応です。コントラクトの名前は、Illuminate\Contracts\ より後ろの部分だけを書いています。たとえば Auth\Guard は Illuminate\Contracts\Auth\Guard です。ファサードが「なし」のものは、対応するファサードがありません。

コントラクト 対応するファサード
Auth\Access\Authorizable なし
Auth\Access\Gate Gate
Auth\Authenticatable なし
Auth\CanResetPassword なし
Auth\Factory Auth
Auth\Guard Auth::guard()
Auth\PasswordBroker Password::broker()
Auth\PasswordBrokerFactory Password
Auth\StatefulGuard なし
Auth\SupportsBasicAuth なし
Auth\UserProvider なし
Broadcasting\Broadcaster Broadcast::connection()
Broadcasting\Factory Broadcast
Broadcasting\ShouldBroadcast なし
Broadcasting\ShouldBroadcastNow なし
Bus\Dispatcher Bus
Bus\QueueingDispatcher Bus::dispatchToQueue()
Cache\Factory Cache
Cache\Lock なし
Cache\LockProvider なし
Cache\Repository Cache::driver()
Cache\Store なし
Config\Repository Config
Console\Application なし
Console\Kernel Artisan
Container\Container App
Cookie\Factory Cookie
Cookie\QueueingFactory Cookie::queue()
Database\ModelIdentifier なし
Debug\ExceptionHandler なし
Encryption\Encrypter Crypt
Events\Dispatcher Event
Filesystem\Cloud Storage::cloud()
Filesystem\Factory Storage
Filesystem\Filesystem Storage::disk()
Foundation\Application App
Hashing\Hasher Hash
Http\Kernel なし
Mail\Mailable なし
Mail\Mailer Mail
Mail\MailQueue Mail::queue()
Notifications\Dispatcher Notification
Notifications\Factory Notification
Pagination\LengthAwarePaginator なし
Pagination\Paginator なし
Pipeline\Hub なし
Pipeline\Pipeline Pipeline
Queue\EntityResolver なし
Queue\Factory Queue
Queue\Job なし
Queue\Monitor Queue
Queue\Queue Queue::connection()
Queue\QueueableCollection なし
Queue\QueueableEntity なし
Queue\ShouldQueue なし
Redis\Factory Redis
Routing\BindingRegistrar Route
Routing\Registrar Route
Routing\ResponseFactory Response
Routing\UrlGenerator URL
Routing\UrlRoutable なし
Session\Session Session::driver()
Support\Arrayable なし
Support\Htmlable なし
Support\Jsonable なし
Support\MessageBag なし
Support\MessageProvider なし
Support\Renderable なし
Support\Responsable なし
Translation\Loader なし
Translation\Translator Lang
Validation\Factory Validator
Validation\ValidatesWhenResolved なし
Validation\ValidationRule なし
Validation\Validator Validator::make()
View\Engine なし
View\Factory View
View\View View::make()

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧