Laravel 中的 cache()与 Cache::两种缓存写法有什么不一样?

在laravel中我这样写

use Illuminate\Support\Facades\Cache;
...
Cache::forever('userToken',$user_token);

可以缓存,然后这样写
cache(["code" => $code], 1);
也行
我希望知道这两种缓存方式的区别?以及Cache::forever说是永久缓存,那么何时失效
还有怎么才能想tp3一样顺滑如丝的使用session?

Maybe we are frend.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

先来看下cache方法是什么,下面是框架定义的cache方法

/**
     * Get / set the specified cache value.
     *
     * If an array is passed, we'll assume you want to put to the cache.
     *
     * @param  dynamic  key|key,default|data,expiration|null
     * @return mixed|\Illuminate\Cache\CacheManager
     *
     * @throws \Exception
     */
    function cache()
    {
        // 获取输入参数
        $arguments = func_get_args();
        // 如果参数为空,从服务容器获取cache类并返回
        if (empty($arguments)) {
            return app('cache');
        }
        // 如果参数一是字符串,从服务容器获取cache类并调用get方法获取缓存值
        if (is_string($arguments[0])) {
            return app('cache')->get($arguments[0], $arguments[1] ?? null);
        }
        // 判断参数一是否是数组,如果不是数组,报错
        if (! is_array($arguments[0])) {
            throw new Exception(
                'When setting a value in the cache, you must pass an array of key / value pairs.'
            );
        }
        // 判断参数二是否存在,不存在报错
        if (! isset($arguments[1])) {
            throw new Exception(
                'You must specify an expiration time when setting a value in the cache.'
            );
        }
        // 通过参数一和参数二缓存数据
        return app('cache')->put(key($arguments[0]), reset($arguments[0]), $arguments[1]);
    }

这里用到了一个框架的核心概念,就是服务容器,cache方法通过app方法获取服务容器中已经注册的Cache类。这个Cache类在config/app.php里面已经定义了映射,如下:

'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        // ...其他类
];

可以看到这里的Cache字符串绑定了Illuminate\Support\Facades\Cache::class类,与你直接用Cache::forever()所引用的类是一致的,所以这也是为什么cache()方法是辅助函数的原因。唯一的区别就是调用的方法不一样,通过cache()调用的是Cacheput方法,必须设置过期时间,Cache::forever()是添加永久的缓存,既然是永久缓存,那就是永远不会过期,也就是说通过Cache::get()方法一直可以获取到。

至于和TP3一样顺滑如丝的使用session是怎么个使用法?直接调用session方法吗?如果是这样,laravel也是可以直接调用session方法的,详细使用方式请参阅文档。

5年前 评论
讨论数量: 3

先来看下cache方法是什么,下面是框架定义的cache方法

/**
     * Get / set the specified cache value.
     *
     * If an array is passed, we'll assume you want to put to the cache.
     *
     * @param  dynamic  key|key,default|data,expiration|null
     * @return mixed|\Illuminate\Cache\CacheManager
     *
     * @throws \Exception
     */
    function cache()
    {
        // 获取输入参数
        $arguments = func_get_args();
        // 如果参数为空,从服务容器获取cache类并返回
        if (empty($arguments)) {
            return app('cache');
        }
        // 如果参数一是字符串,从服务容器获取cache类并调用get方法获取缓存值
        if (is_string($arguments[0])) {
            return app('cache')->get($arguments[0], $arguments[1] ?? null);
        }
        // 判断参数一是否是数组,如果不是数组,报错
        if (! is_array($arguments[0])) {
            throw new Exception(
                'When setting a value in the cache, you must pass an array of key / value pairs.'
            );
        }
        // 判断参数二是否存在,不存在报错
        if (! isset($arguments[1])) {
            throw new Exception(
                'You must specify an expiration time when setting a value in the cache.'
            );
        }
        // 通过参数一和参数二缓存数据
        return app('cache')->put(key($arguments[0]), reset($arguments[0]), $arguments[1]);
    }

这里用到了一个框架的核心概念,就是服务容器,cache方法通过app方法获取服务容器中已经注册的Cache类。这个Cache类在config/app.php里面已经定义了映射,如下:

'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        // ...其他类
];

可以看到这里的Cache字符串绑定了Illuminate\Support\Facades\Cache::class类,与你直接用Cache::forever()所引用的类是一致的,所以这也是为什么cache()方法是辅助函数的原因。唯一的区别就是调用的方法不一样,通过cache()调用的是Cacheput方法,必须设置过期时间,Cache::forever()是添加永久的缓存,既然是永久缓存,那就是永远不会过期,也就是说通过Cache::get()方法一直可以获取到。

至于和TP3一样顺滑如丝的使用session是怎么个使用法?直接调用session方法吗?如果是这样,laravel也是可以直接调用session方法的,详细使用方式请参阅文档。

5年前 评论

可以这样

cache()->forever();
cache()->get();
5年前 评论

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