php - Laravel 中的仓库和接口(interface)有什么用?

标签 php laravel laravel-5 interface repository

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

我下载了一些项目以了解它们的编码方式。据我了解,他们中的许多人只使用与 Codeigniter 相同的模型、 View 和 Controller 。

但是有一个项目使用了存储库和接口(interface)。真的很难理解那个项目是怎么回事。那么 Laravel 中的仓库和接口(interface)有什么用呢?我应该什么时候使用它们?

最佳答案

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

接口(interface)\契约(Contract)

一般来说,OOP 接口(interface)用于描述实现该接口(interface)的类提供了哪些方法/功能而不关心实际的实现

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

<?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))    {
            //
        }
    }
}

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

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

<?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))    {
            //
        }
    }
}

现在我们的代码没有与任何特定的实现耦合,因为 Cache 实际上是一个接口(interface)。所以基本上在我们的类中,我们需要一个类的实例 表现 就像 Cache 接口(interface)中描述的那样,但我们对如何并不真正感兴趣> 它在内部工作。这样做,如果我们想更改缓存实现,我们可以编写一个实现接口(interface) Cache 的类,而无需更改 OrdersCache 类中的任何代码行。这样做我们的代码更容易理解和维护,并且你的包更易于重用。请参阅 Loose Coupling 部分在 Laravel 文档中获取更多示例。

接口(interface)和服务容器

Laravel 的主要功能之一是它的Service Container,它用于管理依赖项和执行依赖项注入(inject)。请看Service Container Laravel 文档中的定义。

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

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

让我们的类(class)成为

<?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 类的实例。在这种情况下,每次实例化您的 Controller 时,Laravel 都会将 RedisEventPusher 的实例传递给您的 Controller ,而无需指定其他任何内容。

您可以通过查看 Binding Interfaces to Implementation 来深入了解它。 Laravel 文档部分。

存储库

存储库是适用于 MVC 模式的概念,独立于任何特定框架。通常你的模型是数据层(例如直接与数据库交互),你的 Controller 处理对数据层的访问逻辑,你的 View 显示 Controller 提供的数据。

存储库可以定义如下:

To put it simply, Repository pattern is a kind of container where data access logic is stored. It hides the details of data access logic from business logic. In other words, we allow business logic to access the data object without having knowledge of underlying data access architecture.
Soruce: https://bosnadev.com/2015/03/07/using-repository-pattern-in-laravel-5

要了解如何在 Laravel 中使用它们,请查看 great article .

就是这样,我希望它能帮助你理清思路。

关于php - Laravel 中的仓库和接口(interface)有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45914154/

相关文章:

php - 允许用户每 24 小时登录一次

php - Google Maps API - 标记网址/ID

laravel - 如何使作业失败并使其跳过 Laravel 队列中的下一次尝试?

从 phpmyadmin 丢失数据库后 php artisan 迁移错误

php - 我怎样才能构造一个表,使字段保持原子性?

laravel - 我如何让所有属于 parent 的 child 都有 Eloquent ?

php - Laravel Observers - 有什么方法可以传递额外的参数吗?

php - Auth::id() 返回 null laravel

javascript - 如何在 daterangepicker JS 和 Laravel 中禁用占用日期

php - 将MySQL中的数据输出到二维数组