0

我正在尝试使用 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');
});

环境配置

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

4

1 回答 1

3

您似乎对 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');
于 2019-01-04T13:43:10.867 回答