Muh*_*der 3 php caching middleware laravel-5
我试图使用中间件缓存整个响应
我遵循的步骤
生成两个中间件
在BeforeCacheMiddleware中:
public function handle($request, Closure $next)
{
$key = $request->url();
if(Cache::has($key)) return Cache::get($key);
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
在AfterCacheMiddleware中
public function handle ($request, Closure $next)
{
$response = $next($request);
$key = $request->url();
if (!Cache::has($key)) Cache::put($key, $response->getContent(), 60);
return $response;
}
Run Code Online (Sandbox Code Playgroud)
在kernal.php的$ routeMiddleware数组中注册的中间件
'cacheafter' => 'App\Http\Middleware\AfterCacheMiddleware',
'cachebefore' => 'App\Http\Middleware\BeforeCacheMiddleware',
Run Code Online (Sandbox Code Playgroud)
在routes.php中,我正在调用这样的虚拟路线
Route::get('middle', ['middleware' => 'cachebefore', 'cacheafter', function()
{
echo "From route";
}]);
Run Code Online (Sandbox Code Playgroud)
问题:
只有缓存才能调用中间件.cacheafter根本没有被调用
任何人都可以建议我在这里缺少什么?
我在寻找解决方案时发现了这个问题.我知道有Flatten包来做这个缓存,但是我找不到关于如何自己做这个的好例子.此问题中的解决方案尝试包含对我自己的解决方案有用的想法,尽管我选择仅使用单个中间件.
虽然问题很老,而且提问者可能不再需要答案了,但我会在这里分享我的解决方案,因为我觉得SO(和互联网)缺少Laravel 5的缓存样本.我会尽量解释,尽我所能,但对于大多数的利益,你应该熟悉路由,高速缓存和Middlewaring在Laravel 5.所以这里去解决方案:
创建一个中间件,通常放在app/Http/Middleware
文件夹中,我将调用该文件CachePage.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
use Cache;
class CachePage
{
public function handle($request, Closure $next)
{
$key = $request->fullUrl(); //key for caching/retrieving the response value
if (Cache::has($key)) //If it's cached...
return response(Cache::get($key)); //... return the value from cache and we're done.
$response = $next($request); //If it wasn't cached, execute the request and grab the response
$cachingTime = 60; //Let's cache it for 60 minutes
Cache::put($key, $response->getContent(), $cachingTime); //Cache response
return $response;
}
}
Run Code Online (Sandbox Code Playgroud)
$key
根据您的需要进行更改...您拥有所有$request
参数... 如果您要手动清除缓存并且不希望它过期,请更改Cache::put($key, $value, $minutes)
为Cache::forever($key, $value)
.
在大多数情况下,使用URL作为存储缓存的密钥是可用的,但是人们可能会想到某个更适合某个项目的东西.
app/Http/Kernel.php
通过将中间件添加到$routeMiddleware
数组来注册它,如下所示:
protected $routeMiddleware = [
/* ... */
/* Other middleware that you already have there */
/* ... */
'cachepage' => \App\Http\Middleware\CachePage::class,
];
Run Code Online (Sandbox Code Playgroud)
当然,\App\Http\Middleware\CachePage
如果你把它放在别处或给它另一个名字,你应该改变.键名cachepage
也取决于您 - 它将用于调用中间件.
例如,在您app/Http/routes.php
使用中间件auth
或其他中间件时,您可以为应缓存的所有页面创建一个路由组:
Route::group(['middleware' => 'cachepage'], function ()
{
Route::get('/', 'HomeController@home');
Route::get('/contacts', 'SectionController@contacts');
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2912 次 |
最近记录: |