Laravel - значение потерь сеансовой переменной на промежуточном программном обеспечении - PullRequest
0 голосов
/ 14 января 2019

У меня есть провайдер, который стабилизирует переменную сеанса:

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), я получаю экземпляр платформы, поэтому переменная имеет правильные данные.

Что мне не хватает? Может быть, вызов значения переменных сеанса в промежуточном программном обеспечении удаляет его значение?

1 Ответ

0 голосов
/ 15 января 2019

Я смог наконец справиться сам (спасибо @Thomas за удаление ваших полезных комментариев). Промежуточное ПО Laravel имеет 3 типа:

  • Общее
  • Маршрут
  • * Группа 1008 *

В этом случае я использовал общее промежуточное ПО (влияет на каждый запрос в проекте). Общее промежуточное программное обеспечение загружается до того, как Laravel загружает переменные сессий. Так что это пустое.

...