简介

Laravel 的「契约(Contract)」是一组接口,它们定义由框架提供的核心服务。例如,php illuste\Contracts\Queue\Queue Contract 定义了队列所需的方法,而 php illuste\Contracts\Mail\Mailer Contract 定义了发送邮件所需的方法。

每个契约都有由框架提供的相应实现。例如,Laravel 提供了一个支持各种驱动的队列实现,还有一个由 SwiftMailer 提供支持的邮件程序实现等等。

所有的 Laravel Contract 都存在于它们各自的 GitHub 仓库。这为所有可用的契约提供了一个快速的参考点,以及一个可以被包开发人员使用的独立的包。

Contract 对比 Facade

Laravel 的 Facade 和辅助函数提供了一种利用 Laravel 服务的简单方法,无需类型提示并可以从服务容器中解析 Contract。在大多数情况下,每个 Facade 都有一个等效的 Contract。

和 Facade(不需要在构造函数中引入)不同,Contract 允许你为类定义显式依赖关系。一些开发者更喜欢以这种方式显式定义其依赖项,所以更喜欢使用 Contract,而其他开发者则享受 Facade 带来的便利。通常,大多数应用都可以在开发过程中使用 Facade。

何时使用 Contract

使用 Contract 或 Facades 取决于个人喜好和开发团队的喜好。Contract 和 Facade 均可用于创建功能强大且经过良好测试的 Laravel 应用。Contract 和 Facade 并不是一道单选题,你可以在同一个应用内同时使用 Contract 和 Facade。只要聚焦在类的职责应该单一上,你会发现 Contract 和 Facade 的实际差异其实很小。

通常情况下,大部分使用 Facade 的应用都不会在开发中遇到问题。但如果你在建立一个可以由多个 PHP 框架使用的扩展包,你可能会希望使用 php illuminate/contracts 扩展包来定义该包和 Laravel 集成,而不需要引入完整的 Laravel 实现(不需要在 php composer.json 中具体显式引入 Laravel 框架来实现)。

如何使用 Contract

那么,如何实现契约呢?它其实很简单。

Laravel 中的许多类都是通过 服务容器 解析的,包括控制器、事件侦听器、中间件、队列任务,甚至路由闭包。因此,要实现契约,你只需要在被解析的类的构造函数中「类型提示」接口。

例如,看看下面的这个事件监听器:

  1. <?php
  2. namespace App\Listeners;
  3. use App\Events\OrderWasPlaced;
  4. use App\Models\User;
  5. use Illuminate\Contracts\Redis\Factory;
  6. class CacheOrderInformation
  7. {
  8. /**
  9. * 创建一个新的事件监听器实例
  10. */
  11. public function __construct(
  12. protected Factory $redis,
  13. ) {}
  14. /**
  15. * 处理该事件。
  16. */
  17. public function handle(OrderWasPlaced $event): void
  18. {
  19. // ...
  20. }
  21. }

当解析事件监听器时,服务容器将读取构造函数上的类型提示,并注入适当的值。 要了解更多有关在服务容器中注册内容的信息,请查看 其文档。

Contract 参考

下表提供了所有 Laravel Contract 及对应的 Facade 的快速参考:

Contract 对应的 Facade
Illuminate\Contracts\Auth\Access\Authorizable
Illuminate\Contracts\Auth\Access\Gate php Gate
Illuminate\Contracts\Auth\Authenticatable
Illuminate\Contracts\Auth\CanResetPassword
Illuminate\Contracts\Auth\Factory php Auth
Illuminate\Contracts\Auth\Guard php Auth::guard()
Illuminate\Contracts\Auth\PasswordBroker php Password::broker()
Illuminate\Contracts\Auth\PasswordBrokerFactory php Password
Illuminate\Contracts\Auth\StatefulGuard
Illuminate\Contracts\Auth\SupportsBasicAuth
Illuminate\Contracts\Auth\UserProvider
Illuminate\Contracts\Bus\Dispatcher php Bus
Illuminate\Contracts\Bus\QueueingDispatcher php Bus::dispatchToQueue()
Illuminate\Contracts\Broadcasting\Factory php Broadcast
Illuminate\Contracts\Broadcasting\Broadcaster php Broadcast::connection()
Illuminate\Contracts\Broadcasting\ShouldBroadcast
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow
Illuminate\Contracts\Cache\Factory php Cache
Illuminate\Contracts\Cache\Lock
Illuminate\Contracts\Cache\LockProvider
Illuminate\Contracts\Cache\Repository php Cache::driver()
Illuminate\Contracts\Cache\Store
Illuminate\Contracts\Config\Repository php Config
Illuminate\Contracts\Console\Application
Illuminate\Contracts\Console\Kernel php Artisan
Illuminate\Contracts\Container\Container php App
Illuminate\Contracts\Cookie\Factory php Cookie
Illuminate\Contracts\Cookie\QueueingFactory php Cookie::queue()
Illuminate\Contracts\Database\ModelIdentifier
Illuminate\Contracts\Debug\ExceptionHandler
Illuminate\Contracts\Encryption\Encrypter php Crypt
Illuminate\Contracts\Events\Dispatcher php Event
Illuminate\Contracts\Filesystem\Cloud php Storage::cloud()
Illuminate\Contracts\Filesystem\Factory php Storage
Illuminate\Contracts\Filesystem\Filesystem php Storage::disk()
Illuminate\Contracts\Foundation\Application php App
Illuminate\Contracts\Hashing\Hasher php Hash
Illuminate\Contracts\Http\Kernel
Illuminate\Contracts\Mail\MailQueue php Mail::queue()
Illuminate\Contracts\Mail\Mailable
Illuminate\Contracts\Mail\Mailer php Mail
Illuminate\Contracts\Notifications\Dispatcher php Notification
Illuminate\Contracts\Notifications\Factory php Notification
Illuminate\Contracts\Pagination\LengthAwarePaginator
Illuminate\Contracts\Pagination\Paginator
Illuminate\Contracts\Pipeline\Hub
Illuminate\Contracts\Pipeline\Pipeline
Illuminate\Contracts\Queue\EntityResolver
Illuminate\Contracts\Queue\Factory php Queue
Illuminate\Contracts\Queue\Job
Illuminate\Contracts\Queue\Monitor php Queue
Illuminate\Contracts\Queue\Queue php Queue::connection()
Illuminate\Contracts\Queue\QueueableCollection
Illuminate\Contracts\Queue\QueueableEntity
Illuminate\Contracts\Queue\ShouldQueue
Illuminate\Contracts\Redis\Factory php Redis
Illuminate\Contracts\Routing\BindingRegistrar php Route
Illuminate\Contracts\Routing\Registrar php Route
Illuminate\Contracts\Routing\ResponseFactory php Response
Illuminate\Contracts\Routing\UrlGenerator php URL
Illuminate\Contracts\Routing\UrlRoutable
Illuminate\Contracts\Session\Session php 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 php Lang
Illuminate\Contracts\Validation\Factory php Validator
Illuminate\Contracts\Validation\ImplicitRule
Illuminate\Contracts\Validation\Rule
Illuminate\Contracts\Validation\ValidatesWhenResolved
Illuminate\Contracts\Validation\Validator php Validator::make()
Illuminate\Contracts\View\Engine
Illuminate\Contracts\View\Factory php View
Illuminate\Contracts\View\View php View::make()