我正在保存Laravel响应的缓存,并且工作正常。我正在使用一个中间件来检查请求是否存在缓存并返回缓存的响应,而不是再次生成该响应。
但是当闪存消息显示给用户时,它会返回缓存的响应,但没有任何闪存消息。
因此我想在不知道密钥的情况下检查是否有闪存消息。这样我就可以使用flash消息返回非缓存的响应。
这是中间件
public function handle($request, Closure $next, $ttl=1440)
{
if(authenticate_user() != null || $request->isMethod('post'))
return $next($request);
$params = $request->query(); unset($params['_method']); ksort($params);
$key = md5(url()->current().'?'.http_build_query($params));
if($request->get('_method')=='purge')
Cache::forget($key);
if(Cache::has($key)){
$cache = Cache::get($key);
$response = response($cache['content']);
$response->header('X-Proxy-Cache', 'HIT');
}
else {
$response = $next($request);
Cache::put($key,['content' => $response->content(), 'headers' => array_map(function($element){ return implode(',', $element); }, $response->headers->all())],$ttl);
$response->header('X-Proxy-Cache', 'MISS');
}
return $response;
}
这是dd(session())
。如果它可以帮助某人
我想要与success
键对应的数据。
但是,我不想使用特定的密钥来获取Flash数据。 我只是想检查是否有闪存消息,而不管用于存储该数据的密钥。
答案 0 :(得分:1)
Laravel使用_flash
变量在内部跟踪闪存数据,您可以尝试使用
if( Cache::has($key) && empty(session('_flash')['new']) ){
$cache = Cache::get($key);
$response = response($cache['content']);
$response->header('X-Proxy-Cache', 'HIT');
}
else {
$response = $next($request);
Cache::put($key,['content' => $response->content(), 'headers' => array_map(function($element){ return implode(',', $element); }, $response->headers->all())],$ttl);
$response->header('X-Proxy-Cache', 'MISS');
}
对于一些额外的信息,你可能需要稍微调整一下:如果你在一个数组中得到$session
的会话,那么$session['flash']['new']
指的是刚刚闪过的数据。如果你有刚刚闪过" 我们刚刚发送给您并通过电子邮件发送重置密码的说明。"在您的操作中,该消息将位于会话数组中的$session['flash']['new']
下;在第二次刷新时,它将转移到$session['flash']['old']
并且$session['flash']['new']
现在将为空(除非您重新刷新),在第3次刷新时它将无处可用。
因此,实质上如果您为当前请求闪现了某些内容,它将阻止缓存。