具有存储库模式的 Laravel 策略

问题描述 投票:0回答:2

我在 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();
}

谢谢你

laravel repository-pattern policy
2个回答
0
投票

在控制器中:

public function destroy(Link $link)
    {
        $this->authorize('delete', $link);
        $this->repository->delete($link);

        return back()->with('success', 'Item has been removed');
    }

是的,在仓库的删除函数中可以直接写 $model->delete(); 这会将 2 个选择查询减少到 1 个。


0
投票

在您的存储库中:

// repository function
public function delete($model)
{
    return $model->delete();
}

在你的控制器内部:

// My Controller
public function destroy($link)
{
    $model = $this->repository->find($link); // Retrieve model once.

    $this->authorize('delete', $model); // Authz model.

    $this->repository->delete($model); // Pass model to delete.

    return back()->with('success', 'Item has been removed');
}

首先使用

$this->repository->find($id)
检索模型一次。然后在 authz 检查和删除方法中重用此模型实例,这可以防止 Laravel 需要在删除方法中重新查询相同的模型。

© www.soinside.com 2019 - 2024. All rights reserved.