Laravel 中存储库和接口的用法是什么?

2022-08-30 16:35:40

在使用Codeigniter开发了几个项目2年后,我开始学习Laravel。

我下载了一些项目,了解它们是如何编码的。据我所知,他们中的许多人只使用与Codeigniter相同的模型,视图和控制器。

但是一个项目使用了存储库和接口。真的很难理解这个项目发生了什么。那么,在Laravel中,存储库和接口的用途是什么呢?我应该何时使用它们?


答案 1

我将尽量清楚地解释这两个概念。

接口\协定

通常,OOP 接口用于描述实现该接口的类提供哪些方法/功能,而不考虑实际实现

Laravel使用合约主要是为了将服务与实际实现分开。为了更清楚,让我们举个例子

<?php

namespace App\Orders;

class OrdersCache
{

    protected $cache;

    public function __construct(\SomePackage\Cache\Memcached $cache)
    {
        $this->cache = $cache;
    }


    public function find($id)
    {
        if ($this->cache->has($id))    {
            //
        }
    }
}

正如您在此类中看到的那样,代码与缓存实现(即 )紧密耦合,因此,如果该Cache类的API发生变化,我们的代码也必须相应地更改。如果我们想用另一个(例如redis)更改Cache实现,也会发生同样的事情。\SomePackage\Cache\Memcached

而不是这样做,我们的代码可以依赖于与实现无关的接口:

<?php

namespace App\Orders;

use Illuminate\Contracts\Cache\Repository as Cache;

class OrdersCache
{

    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }


    public function find($id)
    {
        if ($this->cache->has($id))    {
            //
        }
    }
}

现在我们的代码没有与任何特定的实现耦合,因为实际上是一个接口。因此,基本上在我们的类中,我们需要一个行为类似于接口中描述的类的实例,但我们对它在内部的工作方式并不感兴趣。这样做,如果我们想更改缓存实现,我们可以编写一个实现接口的类,而无需更改类中的任何代码行。这样做,我们的代码更容易理解和维护,并且您的包更具可重用性。有关更多示例,请参阅 Laravel 文档中的松散耦合部分。CacheCacheCacheOrdersCache

接口和服务容器

Laravel的主要功能之一是它的Service Container,它用于管理依赖关系和执行依赖注入。请查看 Laravel 文档中的服务容器定义。

依赖注入也被Laravel广泛用于将接口绑定到实现。让我们举个例子:

$app->bind('App\Contracts\EventPusher', 'App\Services\RedisEventPusher');

让我们的班级成为

<?php

namespace App\Http\Controllers;

use App\Contracts\EventPusher;

class EventsController extends Controller 
{

    protected $pusher;

    public function __construct(EventPusher $pusher) 
    {

        $this->pusher = $pusher;        

    }

}

在不声明任何其他内容的情况下,我们基本上是说每次有人需要一个EventPusher实例时,请Laravel提供RedisEventPusher类的实例。在这种情况下,每次实例化控制器时,Laravel 都会将 的实例传递给您的控制器,而无需指定任何其他内容。RedisEventPusher

您可以通过查看Laravel文档中的绑定接口到实现部分来深入了解这一点。

存储 库

存储库是一个独立于任何特定框架适用于 MVC 模式的概念。通常,您的模型是数据层(例如,直接与数据库交互),控制器处理数据层的访问逻辑,以及显示控制器提供的数据的视图。

存储库可以定义如下:

简而言之,存储库模式是一种存储数据访问逻辑的容器。它从业务逻辑中隐藏数据访问逻辑的详细信息。换句话说,我们允许业务逻辑在不了解底层数据访问体系结构的情况下访问数据对象。
索鲁塞https://bosnadev.com/2015/03/07/using-repository-pattern-in-laravel-5

要了解如何在Laravel中使用它们,请查看这篇很棒的文章

仅此而已,我希望它有助于理清思绪。


答案 2

接口是任何实现类都应该调用的。

interface CanFlyInterface
{
    public function fly();
}

把它想象成编程,而不用纠缠逻辑。

if ($object instanceof CanFlyInterface) {
    $obj->fly();
}

现在,我们可以传递一个鸟物体,或者一个飞机物体!PHP不在乎,只要它实现了接口!

class Bird implements CanFlyInterface
{
    public function fly()
    {
        return 'flap flap!';
    }
}

class Aeroplane implements CanFlyInterface
{
    public function fly()
    {
        return 'roar! whoosh!';
    }
}

您的另一个问题是,什么是存储库类。它只是一个将所有数据库查询保存在一个地方的类。检查此接口作为示例:

interface RepositoryInterface
{
    public function insert(array $data);
    public function update(array $data);
    public function findById($id);
    public function deleteById($id);
}

希望这应该为您解决问题!祝你好运,所有的PHP编码:-D


推荐