Laravel 不在数据库中存储额外的会话属性
Laravel doesn't store additional session attribute in database
我正在尝试使用 laravel 会话逻辑将特定属性存储在用户的会话 table 中。
会话数Table迁移
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');
});
环境配置
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');
});
会话 table 中的每个属性都会更新,但 "activeEvent" 属性始终为空。
"$request->get('event')" returns 所选事件的整数。已经通过将 activeEvent 的数据类型设置为整数来尝试它。
还尝试了以下代码片段:
$request->session()->push
$request->session()->put
$request->session()->keep
没有任何效果。如何将 activeEvent 属性存储在数据库中?或者这不可能吗?
我正在使用 PHP7.2 / Laravel 5.7 / SQLITE
看来您对 Laravel 会话的数据库驱动程序的工作方式有错误的认识。 sessions
table 的每一行代表一个用户的所有会话数据。当您执行 Session::put('activeEvent', $value);
时,它会将此 'activeEvent' => $value
key/value 对存储到 payload
列中。
您不需要更改此 table 来为您要存储的每个键提供列 - 数据库会话驱动程序将序列化所有 key/value 对并将其放入 payload
列。
所以在你的情况下,将 sessions
table 迁移恢复到你第一次使用 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');
我正在尝试使用 laravel 会话逻辑将特定属性存储在用户的会话 table 中。
会话数Table迁移
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');
});
环境配置
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');
});
会话 table 中的每个属性都会更新,但 "activeEvent" 属性始终为空。
"$request->get('event')" returns 所选事件的整数。已经通过将 activeEvent 的数据类型设置为整数来尝试它。
还尝试了以下代码片段:
$request->session()->push
$request->session()->put
$request->session()->keep
没有任何效果。如何将 activeEvent 属性存储在数据库中?或者这不可能吗?
我正在使用 PHP7.2 / Laravel 5.7 / SQLITE
看来您对 Laravel 会话的数据库驱动程序的工作方式有错误的认识。 sessions
table 的每一行代表一个用户的所有会话数据。当您执行 Session::put('activeEvent', $value);
时,它会将此 'activeEvent' => $value
key/value 对存储到 payload
列中。
您不需要更改此 table 来为您要存储的每个键提供列 - 数据库会话驱动程序将序列化所有 key/value 对并将其放入 payload
列。
所以在你的情况下,将 sessions
table 迁移恢复到你第一次使用 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');