Laravel-中间件上的会话变量损失值

时间:2019-01-14 10:35:37

标签: laravel caching middleware

我有一个提供程序,用于设置会话变量:

public function boot()
    {
        $this->app->singleton('selectedPlatform', function($app) {
            $sp = Session('platform', 0);
            try {
                $p = $sp == 0 ? new Platform : Platform::findOrFail($sp);
            } catch(ModelNotFoundException $error) {
                abort(404);
            }
            return $p;
        });
    }

当我使用app('selectedPlatform')时,我得到了正确的Platform类模型:

<select name="platformSelector" id="platformSelector" class="form-control">
    <option value="0">Seleccione una plataforma</option>
    @foreach(\App\Models\Platform::all() as $platform)
        <option value="{{$platform->id}}" @if(app('selectedPlatform')->id == $platform->id) selected="selected" @endif>{{ $platform->name }}</option>
    @endforeach
</select>

我正在尝试制作一个中间件,在其中检查是否选择了平台(不等于0),如果没有,我向用户发送闪存。

我的问题是,当我在中间件上使用app('selectedPlatform')时,会话变量会丢失其值。

public function handle($request, Closure $next)
{
    $selected = app('selectedPlatform');
    if ($selected instanceof Platform)) {
         FlashMessage::addInfo('You must select a platform', 'Unselected platform');
    }

    return $next($request);
}

如果仅在第一行$selected = app('selectedPlatform')中保留相同的结果,我确实尝试对完整的注释。这样可以确保我们FlashMessage类在这里不是问题。

根据laravel lifecycle的文档,核心首先加载服务容器(包括服务提供者),然后加载中间件。在中间件中,如果我写dd($selected),我将获得平台的一个实例,因此该变量具有正确的数据。

我想念什么?也许在中间件中调用会话变量值会删除其值?

1 个答案:

答案 0 :(得分:0)

我最终可以自己解决(感谢@Thomas删除了您的有用评论)。 Laravel中间件有3种类型:

  • 常规
  • 路线

在这种情况下,我使用的是通用中间件(影响项目中的每个请求)。在Laravel加载会话vars之前,将加载常规中间件。所以变成空白。