Laravel底层原理(二) —— 契约(Contracts)

Royal
2021-12-29 / 0 评论 / 900 阅读 / 正在检测是否收录...
  • 概述
    Contract,翻译过来叫契约、协议等。在 Laravel-china 的翻译中,是一个不翻词,这里也使用 Contract 来代替。
    Contract 就是接口 Interface,用来规范某些服务的功能结构的,在 Laravel 中称之为契约。
    kxrp6ohj.png
    以缓存操作为例,我们直接使用 Cache::get() 和 Cache::put() 即可完成缓存的获取和设置,语法很简单。此时问题来了:缓存的实现有很多种,例如文件缓存,Memcache 缓存,Redis 缓存等,要保证任何一种缓存的操作都具备 get 和 put 方法,如何保证?就是需要每种缓存服务的实现,都实现 Cache 契约,契约就是接口,就可以保证每种缓存的实现都具有一致的结构了。
  • 缓存服务实现与 Cache 契约结构说明
    我们以 Cache 契约和一系列 Cache 服务实现为例,说一下这个结构:
    缓存的相关实现,都位于:Illuminate\Cache\ 下:
    kxrpafvr.png

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

<?php

namespace Illuminate\Cache;

use Illuminate\Contracts\Cache\LockProvider;
use Illuminate\Contracts\Redis\Factory as Redis;
use Illuminate\Redis\Connections\PhpRedisConnection;

class RedisStore extends TaggableStore implements LockProvider
{

}

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

<?php

namespace Illuminate\Contracts\Cache;

interface LockProvider
{
    /**
     * Get a lock instance.
     *
     * @param  string  $name
     * @param  int  $seconds
     * @param  string|null  $owner
     * @return \Illuminate\Contracts\Cache\Lock
     */
    public function lock($name, $seconds = 0, $owner = null);

    /**
     * Restore a lock instance using the owner identifier.
     *
     * @param  string  $name
     * @param  string  $owner
     * @return \Illuminate\Contracts\Cache\Lock
     */
    public function restoreLock($name, $owner);
}

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

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

  • 官方文档概要
    在契约这篇官方文档中,主要说明契约的优势。内容如下:
  • 使用契约原因,可以使得代码低耦合,保证代码的简洁性。
  • 内置契约参考列表
    文档中,有一个章节是比较 Facade 和 Contract。放在一起比较的原因,应该是在 Laraval 中,通常每个 Contract 都有对应的 Facade。就像我们 Cache,就有 Cache 的 Facace 和 Cache 的 Contract。当使用 Cache 时,会导致我们确定不了当前时契约 Contract 还是门面 Facade。这就是放在一起比较的原因吧,语法类似。
    但除此之外,Contract 与 Facade 功能完全不同,作用也不同,其实没有什么可比性。
  • Facade,简化服务的调用语法的功能。
  • Contract,定义一组服务的通用操作接口。
    一组相关的服务,既需要通用的接口,也需要简化调用的操作。就是需要 Contract 也需要 Facade,两者作用完全不同,其实不用混淆,不用放在一起比较的!
1

评论

博主关闭了当前页面的评论