契约(Contracts) | 核心架构 | Laravel 5.6 中文文档


本站和网页 https://xueyuanjun.com/post/8710.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

契约(Contracts) | 核心架构 | Laravel 5.6 中文文档
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.6 中文文档
目录索引
序言
2篇文章
新版特性
升级指南
快速入门
5篇文章
安装配置
目录结构
重量级开发环境:Homestead
轻量级开发环境:Valet
部署应用到生产环境
核心架构
5篇文章
一次 Laravel 请求的生命周期
服务容器
服务提供者
门面(Facades)
契约(Contracts)
基础组件
12篇文章
路由
中间件
CSRF 保护
控制器
HTTP 请求
HTTP 响应
视图
URL 生成
Session
表单验证
异常处理
日志
前端开发
4篇文章
Blade 模板引擎
本地化
快速入门:JavaScript & CSS 脚手架
使用进阶:通过 Laravel Mix 编译前端资源
安全系列
6篇文章
登录认证
API 认证
授权
加密
哈希
重置密码
进阶系列
12篇文章
Artisan 控制台
广播
缓存
集合
事件
文件存储
辅助函数
邮件
通知
扩展包开发
队列
任务调度
数据库操作
6篇文章
快速入门
查询构建器
分页
迁移
数据填充
Redis
Eloquent模型
6篇文章
快速入门
关联关系
集合
访问器和修改器
序列化
API 资源类
测试
5篇文章
快速入门
HTTP 测试
浏览器测试
数据库测试
模拟
官方扩展包
5篇文章
订阅支付解决方案:Laravel Cashier
远程操作解决方案:Envoy Task Runner
队列系统解决方案:Laravel Horizon
全文搜索解决方案:Laravel Scout
第三方登录解决方案:Laravel Socialite
图书
Laravel 5.6 中文文档
核心架构
契约(Contracts)
契约(Contracts)
由 学院君 创建于4年前, 最后更新于 2年前
版本号 #2
16042 views
1 likes
0 collects
简介
Laravel 中的契约是指框架提供的一系列定义核心服务的接口。 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务需要实现的方法,Illuminate\Contracts\Mail\Mailer 契约定义了发送邮件所需要实现的方法。
每一个契约都有框架提供的相应实现。例如,Laravel 为队列提供了多个驱动的实现,邮件则由 SwiftMailer 驱动实现 。
所有 Laravel 契约都有其对应的GitHub库,这为所有有效的契约提供了快速入门指南,同时也可以作为独立、解耦的包被包开发者使用。
契约 Vs. 门面
Laravel 门面为 Laravel 服务的使用提供了便捷方式 —— 不再需要从服务容器中类型提示和契约解析即可直接通过静态门面调用。
不同于门面不需要再构造器中进行类型提示,契约允许你在类中定义显式的依赖。有些开发者喜欢门面带来的便捷,也有些开发者倾向于使用契约,他们喜欢定义明确的依赖。
注:大多数应用中,不管你使用门面还是契约,合适就好。不过,如果你是在构建一个扩展包,那么就应该使用契约,因为更容易测试。
何时使用契约
正如上面所讨论的,大多数情况下使用契约还是门面取决于个人或团队的喜好,契约和门面都可以用于创建强大的、测试友好的 Laravel 应用。只要你保持类的职责单一,你会发现使用契约和门面并没有什么实质性的差别。
但是,对契约你可能还是有些疑问。例如,为什么要全部使用接口?使用接口是不是更复杂?下面让我们从两个方面来扒一扒为什么使用接口:松耦合和简单。
松耦合
首先,让我们看看一些缓存实现的紧耦合代码:
<?php
namespace App\Orders;
class Repository
/**
* 缓存
*/
protected $cache;
/**
* 创建一个新的Repository实例
* @param \SomePackage\Cache\Memcached $cache
* @return void
*/
public function __construct(\SomePackage\Cache\Memcached $cache)
$this->cache = $cache;
/**
* 通过ID获取订单
* @param int $id
* @return Order
*/
public function find($id)
if ($this->cache->has($id)) {
//
在这个类中,代码和给定缓存实现紧密耦合,由于我们基于一个来自包的具体的缓存类,如果包的API变了,那么相应的,我们的代码必须做修改。
类似的,如果我们想要替换底层的缓存技术(Memcached)为别的技术实现(Redis),我们将再一次不得不修改我们的代码库。我们的代码库应该并不知道谁提供的数据或者数据是怎么提供的。
我们可以基于一种简单的、与提供者无关的接口来优化我们的代码,从而替代上述那种实现:
<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
/**
* 创建一个新的Repository实例
* @param Cache $cache
* @return void
*/
public function __construct(Cache $cache)
$this->cache = $cache;
现在代码就不与任何特定提供者耦合,甚至与 Laravel 都是无关的。由于契约包不包含任何实现和依赖,你可以轻松的为给定契约编写可选实现代码,你可以随意替换缓存实现而不用去修改任何缓存消费代码。
简单
当所有 Laravel 服务都统一在简单接口中定义,很容易判断给定服务提供的功能。契约可以充当框架特性的简明文档。
此外,基于简单接口,代码也更容易理解和维护。在一个庞大而复杂的类中,与其追踪哪些方法是有效的,不如转向简单、干净的接口。
如何使用契约
那么,如何实现契约呢?这很简单。
Laravel中很多类都是通过服务容器进行解析,包括控制器,以及监听器、中间件、队列任务,甚至路由闭包。所以,要实现一个契约,需要在解析类的构造函数中类型提示这个契约接口。
例如,看看下面这个事件监听器:
<?php
namespace App\Listeners;
use App\User;
use App\Events\OrderWasPlaced;
use Illuminate\Contracts\Redis\Database;
class CacheOrderInformation
/**
* The Redis database implementation.
*/
protected $redis;
/**
* Create a new event handler instance.
* @param Database $redis
* @return void
*/
public function __construct(Database $redis)
$this->redis = $redis;
/**
* Handle the event.
* @param OrderWasPlaced $event
* @return void
*/
public function handle(OrderWasPlaced $event)
//
事件监听器被解析的时候,服务容器会读取构造函数中的类型提示,并注入适当的值。要学习更多关于服务容器的注册细节,参考其文档。
契约列表
下面是 Laravel 契约列表,以及其对应的“门面”:
契约
对应门面
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\Bus\Dispatcher
Bus
Illuminate\Contracts\Bus\QueueingDispatcher
Bus::dispatchToQueue()
Illuminate\Contracts\Broadcasting\Factory
Broadcast
Illuminate\Contracts\Broadcasting\Broadcaster
Broadcast::connection()
Illuminate\Contracts\Broadcasting\ShouldBroadcast
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow
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\Logging\Log
Log
Illuminate\Contracts\Mail\MailQueue
Mail::queue()
Illuminate\Contracts\Mail\Mailable
Illuminate\Contracts\Mail\Mailer
Mail
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
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\ImplicitRule
Illuminate\Contracts\Validation\Rule
Illuminate\Contracts\Validation\ValidatesWhenResolved
Illuminate\Contracts\Validation\Validator
Validator::make()
Illuminate\Contracts\View\Engine
Illuminate\Contracts\View\Factory
View
Illuminate\Contracts\View\View
View::make()
Laravel
文档
服务容器
松耦合
门面
契约
接口
5.6
工作原理
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
门面(Facades)
>> 下一篇:
路由
无评论
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
简介
契约 Vs. 门面
何时使用契约
松耦合
简单
如何使用契约
契约列表
相关推荐
契约(Contracts)
Laravel 5.4 中文文档
核心架构
契约(Contracts)
Laravel 5.5 中文文档
核心架构
门面(Facades)
Laravel 5.6 中文文档
核心架构
契约(Contracts)
Laravel 5.7 中文文档
核心架构
契约
Laravel 6 中文文档
核心架构
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助