Laravel在条件下在路由中加载中间件

时间:2019-06-20 09:59:09

标签: laravel caching middleware

我有一个用于我的api和im的路由文件,我使用this包来缓存整个响应。

routes/api.php

<?php

Route::get('/types', 'TypeController@indexType')->middleware('cacheResponse:600');

这很好用,但是当我在请求中有特定的标头时,我需要跳过此中间件加载,所以我要制作这种额外的中间件

conditionalCacheResponse.php

<?php

namespace App\Http\Middleware;

use Closure;

class ConditionalCacheResponse
{
    public function handle($request, Closure $next)
    {
        if (request()->header('Draft') != true) {
            $this->middleware('cacheResponse:3600');
        }

        return $next($request);
    }
}

并进行这样的设置

routes/api.php

<?php

Route::get('/types', 'TypeController@indexType')->middleware('conditionalCacheResponse');

但是无法正常工作,我不确定是否可以通过这种方式附加中间件。

1 个答案:

答案 0 :(得分:0)

有几种方法可以执行此操作,一种方法是使用HttpKernel的handle()方法基于对请求标头的检查来取消设置CacheResponse中间件。

因此,在app/Http/Kernel.php中,添加以下方法:

public function handle($request)
{
    if ($request->header('Draft')) {
        if (($key = array_search('Spatie\ResponseCache\Middlewares\CacheResponse', $this->middleware)) !== false) {
            unset($this->middleware[$key]);
        }
    }
    return parent::handle($request);
}

我还没有检查这是否正常,但是应该可以完成。