概述

Contract,翻译过来叫契约、协议等。在 Laravel-china 的翻译中,是一个不翻词,这里也使用 Contract 来代替。

Contract 就是接口 Interface,用来规范某些服务的功能结构的,在 Laravel 中称之为契约。

以缓存操作为例,我们直接使用 Cache::get() 和 Cache::put() 即可完成缓存的获取和设置,语法很简单。此时问题来了:缓存的实现有很多种,例如文件缓存,Memcache 缓存,Redis 缓存等,要保证任何一种缓存的操作都具备 get 和 put 方法,如何保证?就是需要每种缓存服务的实现,都实现 Cache 契约,契约就是接口,就可以保证每种缓存的实现都具有一致的结构了。

缓存服务实现与 Cache 契约结构说明

我们以 Cache 契约和一系列 Cache 服务实现为例,说一下这个结构:

缓存的相关实现,都位于:Illuminate\Cache\ 下:

Laravel5.5 预设了:Apc, Array, File, Database, Memcached, Null, Redis, Taggable 多种缓存的具体实现方案,以常用的 Redis 为例,Illuminate\Cache\RedisStore 就是 redis 缓存服务实现,查看其源代码:

namespace Illuminate\Cache;// 导入契约Store
use Illuminate\Contracts\Cache\Store;
use Illuminate\Contracts\Redis\Factory as Redis;// RedisStore 需要实现 Store,这个Store就是一个契约接口
class RedisStore extends TaggableStore implements Store
{}

可见,该 Redis 缓存功能类,需要实现一个 Store 的接口,这个接口就是 Illuminate\Contracts\Cache\Store ,在 Laravel 中称之为契约,看该 Cache 契约的实现:

namespace Illuminate\Contracts\Cache;interface Store
{// 获取缓存项public function get($key);// 设置缓存项public function put($key, $value, $minutes);
}

接口契约中定义了关于缓存应该具备的方法,这样在缓存操作时,无论文件,Redis 或者 Apc 缓存,都具有了统一的接口,不用担心使用上的语法差异了。

说了这么多,其实就是操作上的抽象层,将需要的操作提取,保证所有驱动实现具有统一的结构。这就是接口的常规目的,Laravel 中叫成了契约而已,没有特殊功能。

契约在编码时的使用

定义好的契约,在编程时的主要使用方式,是从服务容器中解析绑定到该契约上的实现。

还是以 Cache 缓存为例,我们使用时可以使用 Facade 来使用:Cache::get(‘key’) 又或者使用助手函数来使用: cache(‘key’) 。但是无论如何使用,语法都是 app(‘cache’)->get(‘key’) 这个语法来实现的(这个可以参考 Facade - 注 这个章节)。

其中 app(‘cache’) 就是从服务容器中,解析 cache 对应的服务实现。这个服务,实在 Cache 服务提供者中绑定到容器中的,参考代码如下:

文件 Illuminate\Cache\CacheServiceProvider:

class CacheServiceProvider extends ServiceProvider
{// 延迟到使用时才绑定protected $defer = true;public function register(){// 绑定cache到服务容器。$this->app->singleton('cache', function ($app) {return new CacheManager($app);});}

那也就意味着,如果需要在程序中使用缓存对象对象,仅仅需要从容器中解析出来即可。

另一个需要使用契约的场景,就是需要编写扩展时,为了保证扩展是通用的,扩展通常都需要实现某个契约,这样你的扩展就是一个通用的扩展。

官方文档概要

在契约这篇官方文档中,主要说明契约的优势。内容如下:

使用契约原因,可以使得代码低耦合,保证代码的简洁性。

内置契约参考列表文档中,有一个章节是比较 Facade 和 Contract。放在一起比较的原因,应该是在 Laraval 中,通常每个 Contract 都有对应的 Facade。就像我们 Cache,就有 Cache 的 Facace 和 Cache 的 Contract。当使用 Cache 时,会导致我们确定不了当前时契约 Contract 还是门面 Facade。这就是放在一起比较的原因吧,语法类似。

但除此之外,Contract 与 Facade 功能完全不同,作用也不同,其实没有什么可比性。

Facade,简化服务的调用语法的功能。

Contract,定义一组服务的通用操作接口。

一组相关的服务,既需要通用的接口,也需要简化调用的操作。就是需要 Contract 也需要 Facade,两者作用完全不同,其实不用混淆,不用放在一起比较的!

总结

Laraval 中,定义一组相关服务通用操作接口,称之为契约!就这么简单。

Laravel源码解析之契约相关推荐

  1. Laravel源码解析之从入口开始

    前言 提升能力的方法并非使用更多工具,而是解刨自己所使用的工具.今天我们从Laravel启动的第一步开始讲起. 入口文件 laravel是单入口框架,所有请求必将经过index.php define( ...

  2. Laravel源码解析之Console内核

    上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的.除了处理HTT ...

  3. Laravel源码解析之中间件

    中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求 ...

  4. Laravel源码解析之ENV配置

    Laravel在启动时会加载项目中的 .env文件.对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的. 例如,你可能希望在本地使用测试的 Mysql数据库而在上线后希望项目能够自动切换 ...

  5. Laravel源码解析之事件系统

    Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件.事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器. laravel 中事件系统由两部分构 ...

  6. Laravel源码解析之Eloquent Model

    上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现.这篇文章我们来学习Laravel ...

  7. Laravel源码解析之QueryBuilder

    Database 查询构建器 上文我们说到执行 DB::table('users')->get()是由Connection对象执行table方法返回了一个QueryBuilder对象,Query ...

  8. Laravel源码解析之Request

    很多框架都会将来自客户端的请求抽象成类方便应用程序使用,在Laravel中也不例外. Illuminate\Http\Request类在Laravel框架中就是对客户端请求的抽象,它是构建在 Symf ...

  9. Laravel源码解析之HTTP Kernel

    由于 PHP 可以处理 WEB 和 CLI 两种接口请求,所以 Laravel中设计 HttpKernel 和 ConsoleKernel 来处理这两种类型的请求,Http Kernel是Larave ...

最新文章

  1. pyspider积累
  2. MultiBinding的StringFormat参数问题
  3. RabbitMq(十四)消息的事务支持及代码演示
  4. npm run dev报错_React + TypeScript 从零开发Popup组件并发布到 npm
  5. mysql -f --force_mysqldump备份MYSQL数据库的参数详细说明
  6. vbs文件放在java工程中如何调用_VBS教程:在 VBScript 中使用对象
  7. 高等数学(下)思维导图
  8. 30个专业配色网站, 让你配色从此更专业
  9. javaEE自驾游旅游景点管理系统ssm
  10. 思科ccna认证怎么样关于思科ccnaDLSW技术简述
  11. 化工原理 --- 流体流动 2
  12. 人工智能时代,主要带来的变革有哪些?
  13. 【字符集】解决docker 容器中中文乱码问题
  14. ffmpeg----avfifo.h
  15. 计算机毕设(附源码)JAVA-SSM老年公寓管理系统
  16. 关于跨境电商货源——扬帆牧哲
  17. 教Kindle新手 手动升级Kindle固件至5.8.5.0.1 全过程
  18. Python实现淘宝秒杀
  19. 如何将服务器中的图片显示出来并实现删除。
  20. 基于Python的机器学习模型对公司人员离职情况分析及预测

热门文章

  1. 基于深度学习的探地雷达图像异常智能判译技术和软件
  2. layui时间选择器点击事件
  3. WordPress阿里百秀XIU v7.5博客主题
  4. jdk卸载(Jdk卸载不干净的影响)
  5. MySQL关系运算和连接运算_关系数据库系统能够实现的三种基本关系运算
  6. nacos + seata
  7. PDF能编辑吗,PDF怎么编辑页码
  8. unity修改asset store及其他缓存位置
  9. 【二次开发】CityMaker常见分析——通视分析
  10. 高一凡老师的数据结构