如何使用laravel 5跳过某些路由上的视图缓存?

时间:2018-09-11 06:41:45

标签: php laravel caching routes

我在laravel 5项目中启用了路由缓存。 我想跳过特定路线视图上的缓存。

然后我在互联网上找到了这篇文章:

https://laravel-tricks.com/tricks/invalidate-browser-cache-route-middleware

它已经很老了,所以我做了如下修改:

添加在:Http / Kernel.php

protected $routeMiddleware = [
....
 'nohttp-cache' => NoHttpCache::class,
....
];

在Http / Middleware / NoHttpCache.php中创建的类<​​/ p>

namespace App\Http\Middleware;
use Closure;
//use Illuminate\Http\Response;
//use Symfony\Component\HttpFoundation\Response as SymfonyResponse;

class NoHttpCache  {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // This step is only needed if you are returning
        // a view in your Controller or elsewhere, because
        // when returning a view `$next($request)` returns
        // a View object, not a Response object, so we need
        // to wrap the View back in a Response.
//        if ( ! $response instanceof SymfonyResponse)
//        {
//            $response = new Response($response);
//        }

        /**
         * @var  $headers  \Symfony\Component\HttpFoundation\HeaderBag
         */
        $response->header('Pragma', 'no-cache');
        $response->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
        $response->header('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');

        return $response;
    }
}

我认为Laravel 5中没有理由将$ response包装在Response中。 然后只需添加浏览器缓存的“ invalidation”指令即可。...

它似乎可以在添加以下中间件的测试路径上工作:

在code / routes / web.php中

 ....
 Route::get('/', 'MyController@index')->name('test')->middleware('nohttp-cache');
 ....

现在的问题是...

  • 这是在全局启用路由缓存时跳过某些路由上的缓存的正确方法吗?
  • 您是否发现中间件上有任何重大问题?

1 个答案:

答案 0 :(得分:0)

您可以使用Joseph Silber的Laravel页面缓存插件,该插件旨在缓存HTTP GET响应以快速加载页面。

这是一个链接。希望有帮助。

https://github.com/JosephSilber/page-cache