Laravelの使いやすいCacheマクロを共有します。


Laravelが提供するキャッシュツールはとても使いやすいです。マニュアルには、get、put、forget、foreverなどの基本的な使い方が紹介されています。最初は次のように使います。

if (!$article = Cache::get('article_1')) {
    $article = Article::find(1);
    Cache::forever('article_1',$article);
}
これは最も基本的な使い方で、キャッシュが存在するかどうかを自動的に判断し、存在しない場合はデータベースからキャッシュを取り出して書き込む。
その後、モデルはrememberとremember Foreverの方法を持っていることが分かりました。例えば、このようにしてもいいです。

$article = Article::rememberForever('article_1')->where('id','=',1);
この制限があります。複雑なクエリでは、With()を使用して関連データをプリロードした場合は、関連データをキャッシュすることができません。
その後、CacheがResponseのようにマクロをカスタマイズできることがわかったので、次のように試してみました。

//
Cache::macro('want',function($key,$minutes=0,$callback){
    if (!$data = Cache::get($key)) {
        $data = call_user_func($callback);
        if ($minutes == 0) {
            Cache::forever($key,$data);
        } else {
            Cache::put($key,$data,$minutes);
        }
    }
    return $data;
});
この方法はbootstrap/start.phpに置いてもいいです。filterの中のアプリに置いてもいいです。before()の中で、自分のプロジェクトの都合に合わせて、どのように使うかを見てください。

$id = Input::get('id');
$article = Cache::want('article_'.$id,0,function() use ($id){
    return Article::with('tags')->findOrFail($id,['id','cid','title','content_html as content','created_at','updated_at']);
});
個人的にはこのような書き方が好きです。この文章が好きになってほしいです。