代码之家  ›  专栏  ›  技术社区  ›  Javier Torron Diaz

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

  •  0
  • Javier Torron Diaz  · 技术社区  · 7 年前

    我有一个设置会话变量的提供程序:

    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') 我得到了一个正确的平台类模型:

    <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),如果没有,我会向用户发送一个flash。

    我的问题是当我使用 应用程序(“selectedPlatform”) 在中间件上,会话var失去了它的值。

    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);
    }
    

    我试着评论完整的if,只留下第一行 $selected = app('selectedPlatform') 同样的结果。这确保了FlashMessage类不是这里的问题。

    根据 laravel lifecycle 首先核心加载服务容器(包括服务提供者),然后加载中间件。在中间件中,如果我编写 dd($selected) 我得到了平台的一个实例,所以var有正确的数据。

    我错过了什么?也许在中间件中调用会话变量值会删除它的值?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Javier Torron Diaz    7 年前

    我终于可以自己处理了(谢谢@Thomas删除了你的有用评论)。Laravel中间件有三种类型:

    • 总则
    • 路线
    • 集团

    在本例中,我使用的是通用中间件(影响项目中的每个请求)。在Laravel加载会话变量之前加载通用中间件。所以它是空白的。