阅读(1661) (10)

Laravel 8 松耦合

2021-06-23 11:39:39 更新

首先,让我们回顾一些与缓存实现紧密耦合的代码。考虑以下:

<?php

namespace App\Orders;

class Repository
{
    /**
     * 缓存实例
     */
    protected $cache;

    /**
     * 创建一个新的仓库实例
     *
     * @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
{
    /**
     * 缓存实例
     */
    protected $cache;

    /**
     * 创建一个新的仓库实例
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }
} 

现在,该代码尚未耦合到任何特定的供应商,甚至 Laravel。 由于契约包不包含任何实现且没有依赖关系,因此您可以轻松地编写任何给定契约的替代实现,从而使您可以替换缓存实现,而无需修改任何消费缓存的代码。