1、安装
$ composer require spatie/laravel-responsecache
$ php artisan vendor:publish --provider="Spatie\ResponseCache\ResponseCacheServiceProvider"
2、使用
全局使用
将中间件定义在 web 中间件组中,在不使用 doNotCacheResponse 时会缓存所有的 GET 请求。
扩展包也提供了一个 doNotCacheResponse 中间件,用于说明哪些路由不需要缓存。
修改 app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
// 缓存响应
\Spatie\ResponseCache\Middlewares\CacheResponse::class,
],
protected $routeMiddleware = [
// 不缓存的中间件
'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class,
];
//不缓存的路由定义
Route::get('/', 'IndexController@index')->name('root')->middleware('doNotCacheResponse');
指定页面缓存
修改app/Http/Kernel.php
protected $routeMiddleware = [
// 需要缓存的响应
'cacheResponse' => \Spatie\ResponseCache\Middlewares\CacheResponse::class,
];
这时只针对需要缓存的路由使用 cacheResponse 中间件即可,例如:
//对首页进行缓存,第二个参数是缓存时间,单位是分钟,这里缓存 60 分钟。
Route::get('/', 'IndexController@index')->name('home')->middleware('cacheResponse:60');
清除缓存
如果后台将数据进行修改或者删除时,我们需要清除缓存。
//命令清除所有缓存
php artisan responsecache:clear
//方法清除所有缓存
ResponseCache::clear();
//指定某个路由删除缓存
ResponseCache::forget(route('root'));
注意
1、不缓存 ajax 请求;不缓存 testing 环境(APP_ENV=testing)或者 console 模式下的请求;
2、只缓存 GET 请求;只缓存成功的响应或者状态码在 300 至 400 之间跳转的响应。
3、有登录信息的页面不适合缓存,如果必须要缓存,要改成js动态的。
4、csrf token 也会被缓存,再次提交表单时会验证失败,所以有表单的页面不要设置这样的缓存