of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition

作者: xahy 分类: 笔记 发布时间: 2019-07-28 17:58

对项目的 model 层做了简单调整,

将公共方法抽到了一个基类model 里,

并将后台所用的 model 迁移到了后台目录下。

运行之后报错如下

The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "app\common\model\AdminUser" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition

debug并返回如下代码:

/**
 * 判定是否登录
 * @return bool
 */
public function isLogin() {
    ///获取session
    $user = session(config('admin.session_login_user'), '', config('admin.session_login_user_scope'));

    if($user && $user->id) {
        return true;
    }

    return false;
}

 

通过报错信息 Please ensure that the class definition "app\common\model\AdminUser,

再加上刚才的迁移操作,

可以得出来结论是迁移 model 导致的反序列化失败。

解决这一问题,

有几种解决方案:

  • 增加 isLogin 代码健壮性

将 check 部分放到 try catch 体内,如果出现异常,清除 session 并返回报错信息。

/**
 * 判定是否登录
 * @return bool
 */
public function isLogin() {
    try{
        ///获取session
        $user = session(config('admin.session_login_user'), '', config('admin.session_login_user_scope'));

        if($user && $user->id) {
            return true;
        }

    }catch(\Exception $e){
        $this->clearSuperSession();
        $this->error($e->getMessage(),url('/admin/login/login'));
    }
    
    ///默认返回
    return false;
}

 

clearSuperSession部分代码如下:

/***
 * 清除后台管理员session
 */
protected function clearSuperSession(){
    $session_login_user_scope = config('admin.session_login_user_scope');
    if($session_login_user_scope){
        session(null, $session_login_user_scope);
    }else{
        /// 清空session
        if (!session_id()) session_start();
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), '', time()-42000, '/');
        }
        session_destroy();
    }
}

 

  • 直接退出

直接退出,重新登录;前提条件是,退出操作并没有调用 isLogin 方法(比如没有登录就不让调用退出方法),不然也会报这个错误。

  • 恢复如初

将调用的相关 class 恢复到原来的位置。

 

总结:

  1. 迁移代码一定要考虑到相关影响的部分,像这种隐性的部分需要多测试和跑流程来挑出来。
  2. session 存储部分,如登陆:非必要条件下,一般存储个 json 串即可,保留像 userid、一个唯一标识、过期时间等基本信息即可。

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注