如何使用 DbSession 在 Yii2 中创建用户会话管理系统

How to create user session manage system in Yii2 with DbSession

今天当我想为我的网站创建用户个人资料页面并希望创建系统用户可以在这个系统中管理他的活动会话需要

我们如何做到这一点?

我找到这个解决方案来将我的用户 user_id 保存到会话 table

Logging out specified user, listing who's online by using DB sessions

但是实现这个问题还有一个问题:如何根据浏览器和平台对用户会话进行分类,我找到了这个解决方案。

我在会话数据库中添加了另一列,并在其中使用 this class 和下面的代码保存了浏览器信息和用户平台信息。

'components' => [
    //...
    'session' => [
                'class' => 'yii\web\DbSession',
                'writeCallback' => function ($session) {
                    $user_browser = null;
                    if (!Yii::$app->user->isGuest) {
                        $browser = new \BrowserDetection();
                        $user_browser = "{$browser->getName()}-{$browser->getPlatform()}" . ($browser->is64bitPlatform() ? "(x64)" : "(x86)") . ($browser->isMobile() ? "-Mobile" : "-Desktop");
                    }
                    return [
                        'user_id' => Yii::$app->user->id,
                        'last_write' => new \yii\db\Expression('NOW()'),
                        'browser_platform' => $user_browser
                    ];
                }
            ],
   // ...
]

注意: 您将其他数据添加到会话中 table

但是为了找到当前会话,我在检查Yii::$app->session->id时遇到了问题,返回了空字符串值,我在下面的link中找到了解决方案。

Blank Session ID in Module's BeforeAction

在 Yii2-Advanced 我创建 frontend\components\baseController 并从中扩展所有控制器并创建 beforeAction() 并在其中打开会话,如下所示:

namespace frontend\components;
class BaseController extends \yii\web\Controller
{
    public function beforeAction($action)
        {
            if (parent::beforeAction($action)) 
            {
                Yii::$app->session->open();
                return true;
            }
              return false;
    }
}

最后,我为会话数据库创建了 ActiveRecord 模型,并在配置文件页面中使用它来显示或删除用户会话