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

Laravel-使用存储库模式

卫才哲
2023-03-14

我正在尝试学习存储库模式,似乎有点困惑,当我急于加载关系并将db逻辑排除在控制器之外时,如何使用此存储库模式

快速概述我的存储库/应用程序结构。

app/
  Acme/
    Repositories/
      RepositoryServiceProvider.php
      Product/
        EloquentProduct.php
        ProductInterface.php
      Category/
        EloquentCategory.php
        CategoryInterface.php

示例ProductInterface。php

<?php namespace GD\Repositories\Product;

interface ProductInterface
{
    public function all();

    public function find($id);

    public function findBySlug($slug);
}

示例类别接口。php

<?php namespace GD\Repositories\Category;

interface CategoryInterface
{
    public function all();

    public function find($id);

    public function findBySlug($slug);
}

好的,最简单的部分是使用DI向控制器注入模型依赖关系。

列出与相关产品的所有类别更加困难,因为我不再使用雄辩的模型。我正在使用一个界面,它没有暴露所有雄辩的方法。

如果我没有在我的EloquentCategory类中实现with方法,这将不起作用。。。

public function show($slug)
{
  return Response::json($this->category->findBySlug($slug)->with('products'), 200);
}

我是否应该创建一个单独的服务类来将两个存储库粘合在一起?e、 g.允许以下情况:

public function __construct(ShopService $shop)
{
  $this->shop = $shop;
}

public function show($slug)
{
  return Response::json( $this->shop->getProductsInCategory($slug), 200 );
}

或者,我应该在我的类别存储库中实现with方法吗?

public function with($relation)
{
  return Category::with($relation);
}

最后,我对存储库模式用法的理解是否正确?

共有2个答案

罗烨霖
2023-03-14

有一个很简单的方法做到这一点并深入探讨在这个环节

http://heera.it/laravel-repository-pattern#.U6XhR1cn-f4

我一直在寻找精确的解决方案,到目前为止效果很好

因此,您的想法是在存储库代码中声明这一点

public function __construct(\Category $category)
{
    $this->category = $category;
} 
public function getAllUsers()
{
    return $this->category->all();
}

public function __call($method, $args)
{
    return call_user_func_array([$this->category, $method], $args);
}

在缺少某些函数时强制调用模型

苏建安
2023-03-14

您考虑过了,存储库只是您的控制器模型之间的一个链接/桥梁,因此控制器使用存储库类而不是模型直接在该存储库中使用模型声明您的方法,例如:

<?php namespace GD\Repositories\Category;

interface CategoryInterFace{

    public function all();

    public function getCategoriesWith($with);

    public function find($id);
}

现在在repository类中实现接口:

<?php namespace GD\Repositories\Category;

use \EloquentCategory as Cat; // the model
class CategoryRepository implements CategoryInterFace {
    public function all()
    {
        return Cat::all();
    }

    public function getCategoriesWith($with)
    {
        return Cat::with($with)->get();
    }

    public function find($id)
    {
        return Cat::find($id):
    }
}

要在控制器中使用它:

<?php

use GD\Repositories\Category\CategoryInterFace;

class CategoryController extends BaseController {

    public function __construct(CategoryInterFace $category)
    {
        $this->cat = $category;
    }

    public function getCatWith()
    {
        $catsProd = $this->cat->getCategoriesWith('products');
        return $catsProd;
    }

    // use any method from your category
    public function getAll()
    {
        $categories = $this->cat->all();

        return View::make('category.index', compact('categories'));
    }

}

注意:省略了存储库的IoC绑定,因为这不是您的问题,您知道这一点。

更新:我在这里写了一篇文章:LARAVEL–使用存储库模式。

 类似资料:
  • 我查阅了许多存储库设计模式教程,如 https://asperbrothers.com/blog/implement-repository-pattern-in-laravel/ https://www.larashout.com/how-to-use-repository-pattern-in-laravel https://laravelarticle.com/repository-desig

  • 我正在尝试实现一个简单的REST服务,该服务基于具有Spring启动和Spring数据Rest的JPA存储库。(请参阅此教程)如果将以下代码与 gradle 一起使用,则运行良好: 为了让事情变得更简单,我使用Spring boot CLI(“Spring run”命令)尝试了相同的代码。 不幸的是,这似乎不起作用@RepositoryRestResource似乎无法像@RestControlle

  • 嗨,我正在尝试使用抽象类在 laravel 中实现存储库模式,以拥有一些我新手的基本功能。 我正在得到 分析错误:语法错误,意外'- 在AbstractRepository一行- AbstractRepository.php ReportRepositoryInterface.php ReportRepository.php ReportsController.php 有谁能开导一下吗?谢谢

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

  • 在阅读了T. Otwell关于Laravel中良好设计模式的书后,我在Laravel 4中创建了一个应用程序,我发现自己为应用程序上的每个表创建了存储库。 我最终得到了以下表格结构: 学生:身份证,姓名 我有用于所有这些表的find、create、update和delete方法的存储库类。每个存储库都有一个与数据库交互的雄辩模型。根据Laravel的文档在模型中定义了关系:http://larav

  • 我一直使用Repository模式,但对于我的最新项目,我想看看是否可以完善它的使用和“工作单元”的实现。我越开始挖掘,我就开始问自己:“我真的需要它吗?” 现在这一切都始于对 Stackoverflow 的几条评论,并追溯到 Ayende Rahien 在他的博客上的帖子,其中有 2 条具体, < li >存储库是新的单一存储库 问:没有仓库的生活值得活下去吗 这可能会永远被谈论,这取决于不同的