首页 > 解决方案 > laravel 存储库 - 为什么需要调用接口而不是直接调用存储库文件?

问题描述

我已经阅读了存储库模式。所以,我创建了UserRepositoryInterface.php文件

namespace App\Interfaces;

use Prettus\Repository\Contracts\RepositoryInterface;

interface UserInterface extends RepositoryInterface
{
    // Code
}

然后我创建了UserRepository.php

<?php

namespace App\Repositories;

use Prettus\Repository\Eloquent\BaseRepository;
use App\Interfaces\UserInterface;

class UserRepository extends BaseRepository implements UserInterface
{
    public function model()
    {
        return User::class;
    }
}

最后,我将接口绑定到类RepositoryServiceProvider.php

    public function boot()
    {
        $this->app->bind(UserInteface::class, UserRepository::class);
    }

将存储库注入类时,我想知道应该使用UserRepositoryor注入UserInterface。我读过UserInterface应该注入,但我不明白为什么我们不只是使用UserRepository,它可以更快,不是吗?有人帮忙吗?

谢谢。

标签: phplaravelinterfacerepository

解决方案


注入接口而不是具体类的全部意义在于让change/extend/maintenance/test.

现在,在您的情况下,您已经注入 UserRepositoryInterface了一些控制器方法或构造函数。但是UserRepository类仍然与 Eloquent 的代码紧密耦合(因为它扩展了 Eloquent 的类)。

现在假设您正在从另一个提供者/来源获取用户(可能通过 API 调用从第 3 方)。您可以在单独的类中设置该代码\App\Repositories\ApiCallUserRepository(例如)。

您还可以设置ApiCallUserRepository(新创建的类)来实现\App\Interfaces\UserInterface.

当您拥有所有这些时,您应该进行的唯一更改是更改提供程序,或者换句话说,您只需要指示应用程序在依赖注入接口时使用哪个具体类。此外,这意味着应该从两个具体类(存储库提供者)向使用存储库的类(即控制器的方法)提供相同的数据结构,或者至少接收数据的类/代码应该期望提供结构,无论它是 Eloquent Collection 还是一些其他类型的集合。

通过这种方式,您可以很好地设置服务,例如获取用户。并且您可以轻松地从您想要获取用户的提供商中选择。

这还不是全部:在执行时(即发出请求时),您可以设置适当的具体类或根据任意规则制作附加代码。在 Laravel 的服务容器检查中when()->needs()->give(),我也强烈建议您再次浏览完整(页面)文档

也不要限制自己,而是通过其他关于 DI 的通用和特定文章:

php-di

设计模式php

Symfony 依赖注入组件

薄层

也许所有这些看起来都是开销,但实际上它是以良好、标准、可维护和可测试的方式扩展应用程序的良好起点。


推荐阅读