具有存储库模式的 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 策略的主要内容,如果未能解决你的问题,请参考以下文章

laraver框架学习------工厂模型填充测试数据

在 Laravel 中管理关系,遵循存储库模式

Laravel Eloquent 与存储库/服务设计模式的关系

Laravel 4 使用存储库模式(由 Eloquent 支持)和缓存的可扩展设计

数据库中的计算字段 - Laravel

我想自学laraver,请诸位前辈给一些建议,谢谢