Laravel缓存雄辩

Kou*_*sha 2 caching laravel

使用Eloquent模型缓存有什么区别

$myResult = Model::remember(5)->get();
Run Code Online (Sandbox Code Playgroud)

并使用Cache自己:

$myResult = Cache::remember('myModel', 5, function(){
    return Model::get();
});
Run Code Online (Sandbox Code Playgroud)

它们是相同的,还是每个用于不同的目的?

Lau*_*nce 6

你正在缓存同样的事情 - 但是以两种不同的方式.它们在技术上是相同的(相同的查询结果在两个示例中缓存5分钟) - 但它们与"关注点分离"问题不同.

当你处理一个模型 - 也许它在你的控制器中 - 你的控制器应该不知道模型的'内部'工作.它应该只是询问信息,并获得正确的信息.

因此,使用您的示例 - 我们有两种方法可以构建控制器:

首先 - 我们可以让控制器知道"太多"并执行此操作:

function showUser($id)
{
    $myResult = Cache::remember('myModel', 5, function(){
        return Model::find($id);
    });
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中 - 控制器知道模型的内部工作,并且它还指示缓存应该有多长.但是控制器应该不知道用户是什么,或者应该缓存多长时间 - 最好由模型来管理.即如果你在代码中的其他地方寻找用户会发生什么 - 你必须复制你的缓存.

同时你可以这样做:

function showUser($id)
{
      $user= User::getUser($id);
}
Run Code Online (Sandbox Code Playgroud)

然后在您的用户模型中

function getUser($id)
{
      return User::remember(5)->find($id);
}
Run Code Online (Sandbox Code Playgroud)

这样,用户的管理保留在模型内.该模型知道应该缓存用户多长时间(如果有的话).(是的 - 有些人会说缓存应该从模型中抽象到存储库中 - 但是现在让它保持简单).在这个例子中,控制器不知道结果是否被缓存 - 但它不需要也不应该 - 它需要的只是具有id的用户$id