Laravel 契约(Contracts)

本文重在记录自己的理解和一些心得,如果有什么错误,或者不足,欢迎抛砖!!!

关于契约是否仅仅是这种用法, 和什么时候应该使用契约还是得猿们自行研究,有什么问题欢迎一起探讨!

契约是什么


Laravel中的契约是指框架提供的一系列定义核心服务的接口,比如缓存,队列,日志的接口,契约就是接口

为什么要定义接口


定义接口目的为了解耦

当我们依赖注入缓存实例的时候laravel实现如下:

例如:我们选择使用memcached 缓存驱动
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository{
    /**
     * 创建一个新的Repository实例
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }
}

不定义接口

如果不定义接口我们必须这样写
use Memcached;
class Repository{
    /**
     * 创建一个新的Repository实例
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Memcached $cache)
    {
        $this->cache = $cache;
    }
}

这样当我们需要切换缓存驱动为redis 的时候,我们必须去控制器中把依赖注入的类型约定修改成redis,因为redis 的实现,和Memcached 并不一定完全相同,这就说明Memcached缓存紧密耦合与laravel 

什么才算是松耦合


什么才算松耦合,当系统升级,需要对一种实现进行修改(如从Memcached 需要升级到Redis)时,能够不对代码库进行修改,只需要对配置进行修改就能完成升级的时候就算是松耦合了!

一个契约两种,或者多种实现


个人感觉,契约既然定了,那么对应的实现应该是两种,或者更多的实现,或者在不久的将来会有两个或者更多的实现,契约就是来规定这么多实现的。如果肯定只有一种实现,感觉契约就没啥用了!

总结

  • 定义契约,是为了一组功能实现的一个约定,方便第三方接口开发人员的开发
  • 契约更像一个框架的一个目录索引,所有契约的实现组成了框架所有的核心服务,并且可以通过契约快速了解这一组功能是干什么的
  • 对于缓存类来说,缓存的契约,就是为了规定各种缓存实现(Memcached,Redis,文件缓存)需要实现的功能
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

契约 看文档,没看懂。看帖子,看懂了。

4年前 评论
ahjwen 1年前

契约在Repository类确实实现解耦了.
请问我打算把注入的类从Memcached改为Redis,外部要怎样修改才能把Redis实例传到Repository的构造方法

4年前 评论
Wsmallnews (楼主) 4年前

把我给讲明白了,nice!!比官方好

3年前 评论

就是定义一个统一的方法,配置相当于传一个参数 zhen nice

3年前 评论
wzgwzg3366

感觉和观察者模式很相似,
契约接口中定义缓存的一些方法,如put,pull等,
Memcache,Redis实现了缓存契约接口方法,
其他地方调用的时候,调用契约接口里面的方法就可以,不用管是Memcache还是Redis。

2年前 评论
Wsmallnews (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!