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

我正在尝试使用中间件缓存整个响应

我遵循的步骤

生成了两个中间件

  • 后置缓存中间件
  • 缓存中间件之前
使用BeforeCacheMiddleware:

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');
});