Contracts
介绍
Laravel 的“契约”是一组接口,用于定义框架提供的核心服务。例如,一个Illuminate\Contracts\Queue\Queue
契约定义了队列任务所需的方法,另一个Illuminate\Contracts\Mail\Mailer
契约定义了发送电子邮件所需的方法。
每个契约都有框架提供的相应实现。例如,Laravel 提供了包含多种驱动程序的队列实现,以及由Symfony Mailer支持的邮件程序实现。
所有 Laravel 合约都位于各自的 GitHub 仓库中。这为所有可用合约提供了快速参考点,同时也提供了一个单一、解耦的包,可在构建与 Laravel 服务交互的包时使用。
契约与外观
Laravel 的Facades和辅助函数提供了一种使用 Laravel 服务的简单方法,无需在服务容器外进行类型Prompts和解析契约。大多数情况下,每个 Facades 都有一个等效的契约。
与 Facades 不同,Facades 不需要您在类的构造函数中引用它们,而 Contracts 允许您为类定义显式依赖项。有些开发者更喜欢以这种方式显式定义依赖项,因此更喜欢使用 Contracts,而其他开发者则更享受 Facades 的便利性。通常,大多数应用程序在开发过程中都可以毫无问题地使用 Facades。
何时使用Contracts
使用契约还是 Facade 取决于个人喜好以及开发团队的喜好。契约和 Facade 都可以用来创建健壮且经过良好测试的 Laravel 应用程序。契约和 Facade 并不互相排斥。应用程序的某些部分可能使用 Facade,而其他部分则依赖于契约。只要你专注于类的职责,你就会发现使用契约和 Facade 之间几乎没有实际区别。
一般来说,大多数应用程序在开发过程中使用 Facades 不会出现任何问题。如果您正在构建一个与多个 PHP 框架集成的包,您可能希望使用该illuminate/contracts
包来定义与 Laravel 服务的集成,而无需在包文件中引用 Laravel 的具体实现composer.json
。
如何使用Contracts
那么,如何获得合约的实现呢?其实很简单。
Laravel 中的许多类都是通过服务容器解析的,包括控制器、事件监听器、中间件、队列任务,甚至路由闭包。因此,要获取契约的实现,只需在被解析类的构造函数中“类型Prompts”接口即可。
例如,看一下这个事件监听器:
1<?php 2 3namespace App\Listeners; 4 5use App\Events\OrderWasPlaced; 6use App\Models\User; 7use Illuminate\Contracts\Redis\Factory; 8 9class CacheOrderInformation10{11 /**12 * Create the event listener.13 */14 public function __construct(15 protected Factory $redis,16 ) {}17 18 /**19 * Handle the event.20 */21 public function handle(OrderWasPlaced $event): void22 {23 // ...24 }25}
当事件监听器解析后,服务容器将读取类构造函数中的类型Prompts,并注入适当的值。要了解更多关于在服务容器中注册内容的信息,请查看其文档。
合约编号
下表提供了所有 Laravel 契约及其等效外观的快速参考: