У меня есть провайдер, который стабилизирует переменную сеанса:
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), и, если нет, я посылаю пользователю флэш-память.
Моя проблема в том, что когда я использую app('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 сначала ядро загружает контейнер службы (включая поставщиков услуг), а затем загружает промежуточное программное обеспечение. В промежуточном программном обеспечении, если я пишу dd($selected)
, я получаю экземпляр платформы, поэтому переменная имеет правильные данные.
Что мне не хватает? Может быть, вызов значения переменных сеанса в промежуточном программном обеспечении удаляет его значение?