具有存储库模式的 Laravel 策略
Posted
技术标签:
【中文标题】具有存储库模式的 Laravel 策略【英文标题】:Laravel Policy with repository pattern 【发布时间】:2021-04-18 12:41:15 【问题描述】:我在我的 Laravel 应用程序中使用存储库模式。 我的问题与我处理存储库和策略模式时重复的 SQL 查询有关。这是一个例子。
// My Controller
public function destroy($id)
$this->authorize('delete', $this->repository->find($id));
$this->repository->delete($id);
return back()->with('success', 'Item has been removed');
执行上述函数将运行 2 个完全相同的“选择”查询。
第一个是为authorize
函数获取模型时,第二个是在执行删除函数时。
这是这个函数的定义
//repository function
public function delete($id)
return $this->find($id)->delete();
请注意,我知道为什么要执行 2 个相同的查询。我的问题是如何避免在使用策略和存储库模式时发生这种情况?
我应该将模型传递给我的存储库中的删除功能,因此存储库删除功能将是
//new delete function i my repository class
public function delete($model)
return $model->delete();
谢谢
【问题讨论】:
【参考方案1】:在控制器中:
public function destroy(Link $link)
$this->authorize('delete', $link);
$this->repository->delete($link);
return back()->with('success', 'Item has been removed');
可以,在repository的delete函数中可以直接写$model->delete(); 这会将您的 2 个选择查询减少到 1 个。
【讨论】:
感谢您的重播,您是否建议在具有存储库 aproche 的控制器中使用具有删除方法的 depandancy 注入?在您的场景中,我将不得不使用存储库和模型以上是关于具有存储库模式的 Laravel 策略的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 与存储库/服务设计模式的关系