php - 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);
}
将存储库注入类时,我想知道应该使用UserRepository
or注入UserInterface
。我读过UserInterface
应该注入,但我不明白为什么我们不只是使用UserRepository
,它可以更快,不是吗?有人帮忙吗?
谢谢。
解决方案
注入接口而不是具体类的全部意义在于让change/extend/maintenance/test
.
现在,在您的情况下,您已经注入 UserRepositoryInterface
了一些控制器方法或构造函数。但是UserRepository
类仍然与 Eloquent 的代码紧密耦合(因为它扩展了 Eloquent 的类)。
现在假设您正在从另一个提供者/来源获取用户(可能通过 API 调用从第 3 方)。您可以在单独的类中设置该代码\App\Repositories\ApiCallUserRepository
(例如)。
您还可以设置ApiCallUserRepository
(新创建的类)来实现\App\Interfaces\UserInterface
.
当您拥有所有这些时,您应该进行的唯一更改是更改提供程序,或者换句话说,您只需要指示应用程序在依赖注入接口时使用哪个具体类。此外,这意味着应该从两个具体类(存储库提供者)向使用存储库的类(即控制器的方法)提供相同的数据结构,或者至少接收数据的类/代码应该期望提供结构,无论它是 Eloquent Collection 还是一些其他类型的集合。
通过这种方式,您可以很好地设置服务,例如获取用户。并且您可以轻松地从您想要获取用户的提供商中选择。
这还不是全部:在执行时(即发出请求时),您可以设置适当的具体类或根据任意规则制作附加代码。在 Laravel 的服务容器检查中when()->needs()->give()
,我也强烈建议您再次浏览完整(页面)文档。
也不要限制自己,而是通过其他关于 DI 的通用和特定文章:
也许所有这些看起来都是开销,但实际上它是以良好、标准、可维护和可测试的方式扩展应用程序的良好起点。
推荐阅读
- hyperledger-fabric - Hyperledger Fabric 使用最新配置加入对等节点
- azure-devops - 扩展 YAML 管道示例验证步骤
- listview - 在 Flutter 中的 SimpleDialog 内将项目添加到 ListView
- excel - 当按下回车键时,当前单元格的 VBA 代码适用于下面的单元格,而不是当前单元格
- jsf - 使用非 ajax 请求更新 JSF 视图
- javascript - Firebase 云功能在所有功能运行之前完成
- autohotkey - 即使用户已经登录,通过自动热键运行 URL 也会重定向到空白登录页面
- r - 按百分比拆分
- c# - 如何使用更新在我的游戏中正确使用鼠标
- c - 这些有什么区别?