我有一个提供程序,用于设置会话变量:
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)
,我将获得平台的一个实例,因此该变量具有正确的数据。
我想念什么?也许在中间件中调用会话变量值会删除其值?
答案 0 :(得分:0)
我最终可以自己解决(感谢@Thomas删除了您的有用评论)。 Laravel中间件有3种类型:
在这种情况下,我使用的是通用中间件(影响项目中的每个请求)。在Laravel加载会话vars之前,将加载常规中间件。所以变成空白。