laravel中实现存储库模式的正式方法

时间:2019-04-11 07:02:41

标签: laravel

这个问题说我想知道在laravel中使用存储库模式是好事还是不行,因为我在laravel和此处的其他一些地方使用了Eloquent

https://www.dunebook.com/brief-overview-of-design-patterns-used-in-laravel/3

所以这是上述链接的示例:

interface UserRepository {


   public function all(); 
}

和仓库

use User;

class EloquentUserRepository implements UserRepository {

  public function all()
  {
    return User::all();
  }

最后进入控制器:

User::find($id)

提供了使用存储库模式的建议,并且我觉得它在代码中有点重复。任何可从??获得提示的帮助或来源

1 个答案:

答案 0 :(得分:0)

存储库模式正在执行以下操作:

  • 嘿,界面!给我所有用户(全部为UsersRepository)
  • E!给我所有用户。 (EloquentUsers存储库)

在控制器中调用User::find($id)的部分(我认为这是一个错误,因为您在存储库中编写了all函数是您应该在控制器上使用的功能)

我已经在Laravel上完成了存储库模式的一些实现,并且已经做到了。您唯一没有提到的事情,但是我想您也做得很好,就是使用Laravel ioc容器将接口绑定到EloquentUserRepository实现,因此,每次您请求接口实例时,它都会用雄辩的实现实例自动解决。

实际上,您似乎在重复代码,但实际上并非如此,有时存储库模式可能不适合今天的需求,因此您似乎只是在给代码添加不必要的复杂性。在我们的案例中,我们开始使用存储库模式来编写应用程序,但没有利用它,因此我们只是在编写不必要的复杂性层,当我们意识到摆脱了它并决定直接使用模型后,在某些情况下,我们开始再次需要它,因此我们再次实施了它,正如我所说,这完全取决于您当时的需求。

使用此模式最常提及的需求是可以轻松更改ORM,但就我们而言,这从未发生过,老实说,似乎没有发生。但是,拥有存储库的一个有用的用例如下:假设您有一种算法,例如,计算具有以字母 a 开头的用户名的用户数,理想情况下,您将不会实现此功能在您的框架项目上,但是在一个单独的项目上,这样您就可以独立测试并重用它。简而言之,要计算以 a 开头的用户名,您实际上不需要知道您的项目是Laravel项目,Codeigniter项目,Eloquent,Redis还是用Excel文档,您需要知道的是它可以为您提供所有用户,这就是为什么有一个用户存储库界面很有用的原因,您的算法只会说“我需要所有用户”而不会在意还有什么。