Laravel не хранит дополнительный атрибут сеанса в базе данных - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь сохранить определенный атрибут в таблице сеансов пользователя, используя логику сеанса laravel.

Миграция таблицы сеансов

Schema::create('sessions', function (Blueprint $table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->text('activeEvent')->nullable();
    $table->integer('last_activity');
});

ENV Config

APP_NAME=Laravel
APP_ENV=local
APP_KEY={KEY}
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=sqlite

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=database
SESSION_LIFETIME=120

Код

Route::post('/set-event', function(Request $request){
    Session::put('activeEvent', $request->get('event'));
    Session::save();
    return redirect()->route('home');
});

Каждый атрибут в таблице сессий обновляется, но атрибут «activeEvent» всегда равен нулю.

"$ request-> get ('event')" возвращает целое число выбранного события. Уже попробовал, установив тип данных activeEvent в целое число.

Также пробовал со следующими фрагментами:

$request->session()->push
$request->session()->put
$request->session()->keep

Ничего не работает. Как я могу сохранить атрибут activeEvent в базе данных? Или это не возможно?

Я использую PHP7.2 / Laravel 5.7 / SQLITE

1 Ответ

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

Кажется, у вас неправильное представление о том, как работает драйвер базы данных для Laravel Session. Каждая строка вашей таблицы sessions представляет все данные сеанса для одного пользователя. Когда вы делаете Session::put('activeEvent', $value);, она сохраняет эту 'activeEvent' => $value пару ключ / значение в столбце payload.

Вам не нужно изменять эту таблицу, чтобы предоставлять столбцы для каждого ключа, который вы хотите сохранить - драйвер сеанса базы данных будет сериализовать все пары ключ / значение и поместить его в столбец payload.

Так что в вашем случае, верните sessions миграцию таблицы к тому, что было, когда вы впервые сгенерировали ее с помощью команды php artisan session:table. И работайте с Session как обычно: put() для хранения, get() для чтения:

Route::post('/set-event', function(Request $request){
    Session::put('activeEvent', $request->get('event'));

    return redirect()->route('home');
});

...

// Somewhere when you need to retrieve the value
$activeEvent = Session::get('activeEvent');
...