Php 在Laravel 5中缓存整个HTML响应
我正在尝试使用中间件缓存整个响应 我遵循的步骤 生成了两个中间件Php 在Laravel 5中缓存整个HTML响应,php,caching,laravel-5,middleware,Php,Caching,Laravel 5,Middleware,我正在尝试使用中间件缓存整个响应 我遵循的步骤 生成了两个中间件 后置缓存中间件 缓存中间件之前 使用BeforeCacheMiddleware: public function handle($request, Closure $next) { $key = $request->url(); if(Cache::has($key)) return Cache::get($key); return $next($r
- 后置缓存中间件
- 缓存中间件之前
public function handle($request, Closure $next)
{
$key = $request->url();
if(Cache::has($key)) return Cache::get($key);
return $next($request);
}
带有后置缓存中间件
public function handle ($request, Closure $next)
{
$response = $next($request);
$key = $request->url();
if (!Cache::has($key)) Cache::put($key, $response->getContent(), 60);
return $response;
}
在kernal.php的$routeMiddleware数组中注册中间件
'cacheafter' => 'App\Http\Middleware\AfterCacheMiddleware',
'cachebefore' => 'App\Http\Middleware\BeforeCacheMiddleware',
在routes.php中,我这样调用这个虚拟路由
问题:
public function handle($request, Closure $next)
{
$key = $request->url();
if(Cache::has($key)) return Cache::get($key);
return $next($request);
}
只有cachebefore中间件被调用。cacheafter根本没有被调用
有人能告诉我这里缺少什么吗?中间产品列表必须放在方括号内:
Route::get('middle', ['middleware' => ['cachebefore', 'cacheafter'], function()
{
echo "From route";
}]);
我在自己寻找解决方案时发现了这个问题。我知道有一个flatte包可以实现这种缓存,但是我自己找不到很好的例子来说明如何做到这一点。这个问题中的解决方案尝试包含对我自己的解决方案有用的想法,尽管我选择只使用一个中间件 虽然这个问题已经很老了,asker可能不再需要答案,但我会在这里分享我的解决方案,因为我觉得SO(和internet)缺少Laravel 5的缓存示例。我会尽可能多地解释,但为了最大的好处,你应该熟悉,在拉雷维尔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;
}
}
当然,如果您将其放置在其他位置或使用其他名称,则应更改\App\Http\Middleware\CachePage
。此外,键名cachepage
由您决定-它将用于调用中间件
用法
例如,在app/Http/routes.php
中,使用与auth
或其他中间件类似的中间件,您可以为所有应缓存的页面创建路由组:
Route::group(['middleware' => 'cachepage'], function ()
{
Route::get('/', 'HomeController@home');
Route::get('/contacts', 'SectionController@contacts');
});
这就是问题“为什么我的解决方案不能调用第二个中间件?”的答案。我在一个单独的答案中添加了一个与askers尝试不同的完整解决方案。
returncache::get($key)代码>似乎不再适用于Laravel 5.3。使用返回响应(Cache::get($key))相反,我在自己的缓存包中使用了类似的逻辑:
Route::group(['middleware' => 'cachepage'], function ()
{
Route::get('/', 'HomeController@home');
Route::get('/contacts', 'SectionController@contacts');
});