我正在尝试学习存储库模式,并且似乎对如何在渴望加载关系并将数据库逻辑保持在控制器之外时使用此存储库模式感到有点困惑。
我的存储库/应用程序结构的快速概述。
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);
}
CategoryInterface.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);
}
我是否应该创建一个单独的服务类来将两个存储库粘合在一起?例如,允许以下
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);
}
最后,我对仓库模式用法的理解是否正确?
3条答案
按热度按时间v6ylcynt1#
你想多了,repository只是你的
controller
和model
之间的一个链接/桥梁,因此controller直接使用repository
类而不是model
,在那个repository中,你可以从那里使用model
声明你的方法,例如:现在在repository类中实现接口:
要在控制器中使用它,请执行以下操作:
**注意:**省略了仓库的
IoC
绑定,因为这不是您的问题,您知道这一点。**更新:**我在这里写了一篇文章:LARAVEL -使用存储库模式。
6psbrbz92#
有一个非常简单的方法来做到这一点,它是深入探讨在这个环节
http://heera.it/laravel-repository-pattern#.U6XhR1cn-f4
我一直在寻找确切的解决方案,到目前为止,它运行良好
所以你的想法是在你的仓库代码中声明它
当某些函数丢失时,强制调用模型
js81xvg63#
在UnitController.php控制器中
在UnitInterface.php界面
在UnitRepository.php存储库中
在RepositoriesServiceProvider.php中自定义服务提供者绑定Interface & Concrete类(Repository)
在app.php中