当前位置: 首页 > 知识库问答 >
问题:

Laravel:如何实现只有一个存储库的存储库设计模式?

龙德海
2023-03-14

我查阅了许多存储库设计模式教程,如

https://asperbrothers.com/blog/implement-repository-pattern-in-laravel/ https://www.larashout.com/how-to-use-repository-pattern-in-laravel https://laravelarticle.com/repository-design-pattern-in-laravel https://shishirthedev.medium.com/repository-design-pattern-in-laravel-application-f474798f53ec

但是它们都使用多个存储库,并且对每个模型重复所有方法这里是一个示例

class PostRepository implements PostRepositoryInterface
{
  public function get($post_id)
  {
    return Post::find($post_id);
  }

  public function all()
  {
    return Post::all();
  }
} 
interface PostRepositoryInterface
{
  public function get($post_id);

  public function all();
}
class PostController extends Controller
{

  protected $post;

  public function __construct(PostRepositoryInterface $post)
  {
    $this->post = $post;
  }

  public function index()
  {
    $data = [
        'posts' => $this->post->all()
    ];
    return $data;
  }
}

在ReposoryServiceProvider中:

$this->app->bind(
    'App\Repositories\PostRepositoryInterface',
    'App\Repositories\PostRepository'
);

所以现在我有了UserRepositoryPostRepositoryCommentRepository...等,我将不得不添加相同的方法getadd,......在所有存储库中,只需更改型号名称从PostUser...... etc

如何将这些方法统一到一个文件中,只需传递模型名称并像这样使用它-

共有1个答案

庄萧迟
2023-03-14

您需要抽象类AbstractRepository,类似这样的东西。

顺便说一句,也许你不需要存储库模式,在Laravel中这不是最佳实践。

abstract class AbstractRepository
{
     private $model = null;
     //Model::class
     abstract public function model(): string
     protected function query()
     {
         if(!$this->model){
           $this->model = app($this->model());
         }
         return $this->model->newQuery()
     }
     public function all()
     {
        return $this->query()->all();
     }
}
 类似资料:
  • 我正在尝试学习存储库模式,似乎有点困惑,当我急于加载关系并将db逻辑排除在控制器之外时,如何使用此存储库模式。 快速概述我的存储库/应用程序结构。 示例ProductInterface。php 示例类别接口。php 好的,最简单的部分是使用DI向控制器注入模型依赖关系。 列出与相关产品的所有类别更加困难,因为我不再使用雄辩的模型。我正在使用一个界面,它没有暴露所有雄辩的方法。 如果我没有在我的El

  • 我想使用Spring LDAP 设置多个 LDAP 存储库。我的目标是同时在所有存储库中创建或更新对象。 我使用LdapRepository Spring接口,我认为目前这是不可能的。 我想知道我是否可以创建自己的LdapRepository来扩展Spring,但是我不知道如何开始。 这是我的配置: 完整地说,一个存储库: 知道怎么做吗? 提前感谢任何帮助。

  • 前言:我试图在关系数据库的MVC体系结构中使用存储库模式。 我最近开始学习PHP中的TDD,我意识到我的数据库与应用程序的其余部分耦合得太紧密了。我读过关于存储库和使用IoC容器将其“注入”到我的控制器中的文章。很酷的东西。但现在有一些关于存储库设计的实际问题。请考虑以下示例。 所有这些查找方法都使用选择所有字段()方法。然而,在我的应用程序中,我总是试图限制我得到的字段的数量,因为这经常增加开销

  • 问题内容: 前言:我正在尝试在MVC体系结构和关系数据库中使用存储库模式。 我最近开始学习PHP中的TDD,并且意识到我的数据库与我的其余应用程序之间的联系太紧密了。我已经阅读了有关存储库并使用IoC容器将其“注入”到控制器中的信息。很酷的东西。但是现在有一些关于存储库设计的实际问题。考虑以下示例。 问题1:字段过多 所有这些查找方法均使用全选()方法。但是,在我的应用程序中,我总是试图限制获得的

  • 关于存储库模式,我有几个问题: > 如果我只使用离线数据库(例如Room with LiveData),是否使用存储库模式? 如果我的应用程序现在离线,但将来会连接到远程数据库,那么我应该实现存储库模式还是以后再做就不会有问题了?