从会话中获取所有Flash数据

时间:2018-06-16 12:38:18

标签: php laravel laravel-5 laravel-5.3

我正在保存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())。如果它可以帮助某人

Screenshot

我想要与success键对应的数据。

但是,我不想使用特定的密钥来获取Flash数据。 我只是想检查是否有闪存消息,而不管用于存储该数据的密钥。

1 个答案:

答案 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次刷新时它将无处可用。

因此,实质上如果您为当前请求闪现了某些内容,它将阻止缓存。