繁体   English   中英

在Laravel 5中缓存整个HTML响应

[英]Cache entire HTML response in Laravel 5

我试图使用中间件缓存整个响应

我遵循的步骤

生成两个中间件

  • AfterCacheMiddleware
  • BeforeCacheMiddleware

在BeforeCacheMiddleware中:

public function handle($request, Closure $next)
{            
        $key = $request->url();
        if(Cache::has($key)) return Cache::get($key);
        return $next($request);
}

在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;
}

在kernal.php的$ routeMiddleware数组中注册的中间件

'cacheafter' => 'App\Http\Middleware\AfterCacheMiddleware',
'cachebefore' => 'App\Http\Middleware\BeforeCacheMiddleware',

在routes.php中,我正在调用这样的虚拟路线

Route::get('middle', ['middleware' => 'cachebefore', 'cacheafter', function()
{
    echo "From route";
}]);

问题:

只有缓存才能调用中间件。 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;
    }
}

根据您的需要更改$key ...您拥有所有带有所有参数的$request ...将Cache::put($key, $value, $minutes)更改为Cache::forever($key, $value)如果您将手动清除缓存并且不希望它过期。

在大多数情况下,使用URL作为存储缓存的密钥是可用的,但是人们可能会想到某个更适合某个项目的东西。

注册中间件

通过将中间件添加到$routeMiddleware数组,在app/Http/Kernel.php注册它,如下所示:

protected $routeMiddleware = [
    /* ...  */
    /* Other middleware that you already have there */
    /* ... */
    'cachepage' => \App\Http\Middleware\CachePage::class,
];

当然,如果您将其放在别处或给它另一个名称,您应该更改\\App\\Http\\Middleware\\CachePage 密钥名称cachepage也取决于您 - 它将用于调用中间件。

用法

在您的app/Http/routes.php使用中间件就像auth或其他中间件一样,例如,您可以为应该缓存的所有页面创建一个路由组:

Route::group(['middleware' => 'cachepage'], function () 
{
    Route::get('/', 'HomeController@home');
    Route::get('/contacts', 'SectionController@contacts');
});

中间件列表必须在方括号内:

Route::get('middle', ['middleware' => ['cachebefore', 'cacheafter'], function()
{
    echo "From route";
}]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM