合约
简介
Laravel 的“契约”是一组定义框架核心服务的接口。例如,Illuminate\Contracts\Queue\Queue 契约定义了对任务进行排队所需的方法,而 Illuminate\Contracts\Mail\Mailer 契约定义了发送电子邮件所需的方法。
每个契约都有框架提供的相应实现。例如,Laravel 提供了一个具有各种驱动程序的队列实现,以及一个由 Symfony Mailer 提供支持的邮件程序实现。
所有 Laravel 契约都位于 它们自己的 GitHub 仓库 中。这提供了一个快速参考点,可用于所有可用契约,以及一个独立的、解耦的包,可用于构建与 Laravel 服务交互的包。
契约与 Facades
Laravel 的 Facades 和辅助函数提供了一种简单的方法来使用 Laravel 的服务,而无需对服务容器进行类型提示和解析契约。在大多数情况下,每个 Facade 都有一个等效的契约。
与 Facades 不同,后者不需要您在类的构造函数中引入它们,契约允许您为类定义显式依赖项。一些开发人员更喜欢以这种方式显式定义他们的依赖项,因此更喜欢使用契约,而另一些开发人员则喜欢 Facades 的便利。一般来说,大多数应用程序在开发过程中可以毫无问题地使用 Facades。
何时使用契约
使用契约还是 Facades 的决定取决于个人品味和您的开发团队的品味。契约和 Facades 都可以用于创建健壮、经过良好测试的 Laravel 应用程序。契约和 Facades 并非相互排斥。应用程序的某些部分可能使用 Facades,而其他部分依赖于契约。只要您保持类的职责集中,您就会发现使用契约和 Facades 之间几乎没有实际差异。
一般来说,大多数应用程序在开发过程中可以毫无问题地使用 Facades。如果您正在构建一个与多个 PHP 框架集成的包,您可能希望使用 illuminate/contracts 包来定义您与 Laravel 服务的集成,而无需在您的包的 composer.json 文件中引入 Laravel 的具体实现。
如何使用契约
那么,如何获取契约的实现呢?这其实很简单。
Laravel 中许多类型的类都是通过 服务容器 解析的,包括控制器、事件监听器、中间件、排队任务,甚至路由闭包。因此,要获取契约的实现,您只需在要解析的类的构造函数中进行“类型提示”即可。
例如,看看这个事件监听器:
<?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 契约及其等效 Facades 的快速参考:
| 契约 | 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() |