如何封装一个公共的缓存处理. 没想到好的解决方案. 望告知.

在 laravel 的 model 中, 使用缓存. 方式如下.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

class Banner extends Model
{
    protected $table = 'banners';

    public function getImageUrlAttribute($value)
    {
        return config('database.imageDomain') . '/v2' . $value;
    }

    /**
     * @param int $limit
     * @param int $cacheTime
     * @return array|mixed
     */
    public function getBanner(int $limit = 0, int $cacheTime = 10)
    {
        // 有缓存则使用缓存.
        $cacheName = __METHOD__ . '@' . implode(',', func_get_args());
        if (($cacheTime && !config('app.debug')) || config('app.isCache')) {
            $cache = Cache::tags(['home', 'banner'])->get($cacheName);
            if ($cache) {
                return $cache;
            }
        }

        // 没有缓存, 则查询.
        $data = $this->query()->where('status', 1)->orderByDesc('sort')->orderByDesc('id')
            ->when($limit, function ($query, $limit) {
                return $query->limit($limit);
            })->get(['image_url', 'link'])->toArray();

        // 把查询的数据, 放入缓存.
        if ($cacheTime && $data && (!config('app.debug') || config('app.isCache'))) {
            Cache::tags(['home', 'banner'])->put($cacheName, $data, $cacheTime);
        }

        // 返回.
        return $data;
    }
}

getBanner 这个方法中, 我使用当前的 类名 + 方法名 + 参数值 作为缓存名称.

缓存存在就直接返回缓存的数据, 不存在就查询数据库, 把结果放入缓存, 返回数据.

感觉每次使用缓存, 都写一遍这样的代码, 很啰嗦. 有没有什么好的方式, 封装一下. 能解决这个问题.

  • 问题 1 : 缓存名称我用的是 __METHOD__, func_get_args(), 如果封装一个方法 A, 那么得到的就是方法 A 的结果了. 这个怎么办?
  • 问题 2 : 能封装的应该是 有缓存则使用缓存.把查询的数据, 放入缓存. 对应的代码, 而 没有缓存, 则查询. 对应的代码, 是在中间位置, 如何处理? 使用 Closure ?

如果有更高的处理方式, 请告知.

当才华还支持不起理想时,就应该静下心来好好学习了。
qiuyuhome
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
leo
最佳答案

问题 2 可以使用 Cache::remember(),问题 1 需要自己封装

5年前 评论
讨论数量: 2
leo

问题 2 可以使用 Cache::remember(),问题 1 需要自己封装

5年前 评论

可以使用__call( )函数进行封装. 你解决这个问题了吗?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!