LaravelDocs(中文)

契約 (Contracts)

Laravel Contracts 是一組定義核心服務的介面

介紹 (Introduction)

Laravel 的「contracts」是一組定義框架所提供核心服務的介面。例如,Illuminate\Contracts\Queue\Queue contract 定義了佇列任務所需的方法,而 Illuminate\Contracts\Mail\Mailer contract 則定義了發送電子郵件所需的方法。

每個 contract 都有框架提供的對應實作。例如,Laravel 提供了具有多種驅動程式的佇列實作,以及由 Symfony Mailer 驅動的郵件實作。

所有的 Laravel contracts 都存放在它們自己的 GitHub 儲存庫。這為所有可用的 contracts 提供了一個快速參考點,同時也是一個單獨、解耦的套件,可在建立與 Laravel 服務互動的套件時使用。

Contracts vs. Facades

Laravel 的 facades 和輔助函式提供了一種簡單的方式來使用 Laravel 的服務,而不需要在 service container 中型別提示和解析 contracts。在大多數情況下,每個 facade 都有一個等效的 contract。

與 facades 不同(facades 不需要您在類別的建構函式中引入它們),contracts 允許您為類別定義明確的依賴關係。有些開發者偏好以這種方式明確定義他們的依賴關係,因此更喜歡使用 contracts,而其他開發者則享受 facades 的便利性。一般來說,大多數應用程式在開發過程中可以毫無問題地使用 facades。

何時使用 Contracts (When To Use Contracts)

使用 contracts 還是 facades 的決定將取決於個人喜好和您開發團隊的偏好。Contracts 和 facades 都可以用來建立強健、經過良好測試的 Laravel 應用程式。Contracts 和 facades 並非互斥。您的應用程式的某些部分可能使用 facades,而其他部分則依賴 contracts。只要您將類別的職責保持集中,您會發現使用 contracts 和 facades 之間幾乎沒有實際差異。

一般來說,大多數應用程式在開發過程中可以毫無問題地使用 facades。如果您正在建立一個與多個 PHP 框架整合的套件,您可能希望使用 illuminate/contracts 套件來定義您與 Laravel 服務的整合,而不需要在套件的 composer.json 檔案中引入 Laravel 的具體實作。

如何使用 Contracts (How To Use Contracts)

那麼,您如何取得 contract 的實作呢?這實際上非常簡單。

Laravel 中許多類型的類別都是透過 service container 解析的,包括 controllers、event listeners、middleware、queued jobs,甚至是 route closures。因此,要取得 contract 的實作,您只需在被解析類別的建構函式中「型別提示」該介面。

例如,看看這個 event listener:

<?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
    {
        // ...
    }
}

當 event listener 被解析時,service container 會讀取類別建構函式上的型別提示,並注入適當的值。要了解更多關於在 service container 中註冊項目的資訊,請查看其文件

Contract 參考 (Contract Reference)

此表格提供了所有 Laravel contracts 及其等效 facades 的快速參考:

Contract參考的 Facade

Illuminate\Contracts\Auth\Access\Authorizable

 

Illuminate\Contracts\Auth\Access\Gate

Gate

Illuminate\Contracts\Auth\Authenticatable

 

Illuminate\Contracts\Auth\CanResetPassword

 

Illuminate\Contracts\Auth\Factory

Auth

Illuminate\Contracts\Auth\Guard

Auth::guard()

Illuminate\Contracts\Auth\PasswordBroker

Password::broker()

Illuminate\Contracts\Auth\PasswordBrokerFactory

Password

Illuminate\Contracts\Auth\StatefulGuard

 

Illuminate\Contracts\Auth\SupportsBasicAuth

 

Illuminate\Contracts\Auth\UserProvider

 

Illuminate\Contracts\Broadcasting\Broadcaster

Broadcast::connection()

Illuminate\Contracts\Broadcasting\Factory

Broadcast

Illuminate\Contracts\Broadcasting\ShouldBroadcast

 

Illuminate\Contracts\Broadcasting\ShouldBroadcastNow

 

Illuminate\Contracts\Bus\Dispatcher

Bus

Illuminate\Contracts\Bus\QueueingDispatcher

Bus::dispatchToQueue()

Illuminate\Contracts\Cache\Factory

Cache

Illuminate\Contracts\Cache\Lock

 

Illuminate\Contracts\Cache\LockProvider

 

Illuminate\Contracts\Cache\Repository

Cache::driver()

Illuminate\Contracts\Cache\Store

 

Illuminate\Contracts\Config\Repository

Config

Illuminate\Contracts\Console\Application

 

Illuminate\Contracts\Console\Kernel

Artisan

Illuminate\Contracts\Container\Container

App

Illuminate\Contracts\Cookie\Factory

Cookie

Illuminate\Contracts\Cookie\QueueingFactory

Cookie::queue()

Illuminate\Contracts\Database\ModelIdentifier

 

Illuminate\Contracts\Debug\ExceptionHandler

 

Illuminate\Contracts\Encryption\Encrypter

Crypt

Illuminate\Contracts\Events\Dispatcher

Event

Illuminate\Contracts\Filesystem\Cloud

Storage::cloud()

Illuminate\Contracts\Filesystem\Factory

Storage

Illuminate\Contracts\Filesystem\Filesystem

Storage::disk()

Illuminate\Contracts\Foundation\Application

App

Illuminate\Contracts\Hashing\Hasher

Hash

Illuminate\Contracts\Http\Kernel

 

Illuminate\Contracts\Mail\Mailable

 

Illuminate\Contracts\Mail\Mailer

Mail

Illuminate\Contracts\Mail\MailQueue

Mail::queue()

Illuminate\Contracts\Notifications\Dispatcher

Notification

Illuminate\Contracts\Notifications\Factory

Notification

Illuminate\Contracts\Pagination\LengthAwarePaginator

 

Illuminate\Contracts\Pagination\Paginator

 

Illuminate\Contracts\Pipeline\Hub

 

Illuminate\Contracts\Pipeline\Pipeline

Pipeline

Illuminate\Contracts\Queue\EntityResolver

 

Illuminate\Contracts\Queue\Factory

Queue

Illuminate\Contracts\Queue\Job

 

Illuminate\Contracts\Queue\Monitor

Queue

Illuminate\Contracts\Queue\Queue

Queue::connection()

Illuminate\Contracts\Queue\QueueableCollection

 

Illuminate\Contracts\Queue\QueueableEntity

 

Illuminate\Contracts\Queue\ShouldQueue

 

Illuminate\Contracts\Redis\Factory

Redis

Illuminate\Contracts\Routing\BindingRegistrar

Route

Illuminate\Contracts\Routing\Registrar

Route

Illuminate\Contracts\Routing\ResponseFactory

Response

Illuminate\Contracts\Routing\UrlGenerator

URL

Illuminate\Contracts\Routing\UrlRoutable

 

Illuminate\Contracts\Session\Session

Session::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\Translator

Lang

Illuminate\Contracts\Validation\Factory

Validator

Illuminate\Contracts\Validation\ValidatesWhenResolved

 

Illuminate\Contracts\Validation\ValidationRule

 

Illuminate\Contracts\Validation\Validator

Validator::make()

Illuminate\Contracts\View\Engine

 

Illuminate\Contracts\View\Factory

View

Illuminate\Contracts\View\View

View::make()