调用Model类save()方法进行更新操作,修改器调用了两次

浏览:2263 发布日期:2018/04/29 分类:求助交流 关键字: 修改器 模型类
初学thinkphp

这两天在用修改器对密码进行md5加密时出现了一个bug


新增用户和首次修改密码可以正常进行,但是第二次再修改密码一直无法正确比对原密码

查了大半天,发现在用thinkphp5 Model类的save方法进行更新操作时,save方法内部调用了两次自动完成 对密码进行了两次加密

下面是thinkphp5 Model类的save方法 1071行~1081行

可以看到 当进行更新操作时 autoCompleteData方法调用了两次// 数据自动完成
$this->autoCompleteData($this->auto);

// 事件回调
if (false === $this->trigger('before_write', $this)) {
     return false;
}
$pk = $this->getPk();
    if ($this->isUpdate) {
// 自动更新
$this->autoCompleteData($this->update);
我写的修改密码方法如下 public function edit(Request $request){
        $code = $this->code["edit"];
        if(!$request->isPut()){
            return json(["code"=>$code["wrong_method"],"msg"=>"请求方式错误"]);
        }
        $input = $request->put();
        if(empty($input["username"]) || empty($input["password"]) || empty($input["new_password"])){
            return json(["code"=>$code["argument_error"],"msg"=>"参数错误"]);
        }
        try{
            $admin = new Admin();
            $result = $admin->where("username","=",$input["username"])->find();

            if(!$result){
                return json(["code"=>$code["username_not_exist"],"msg"=>"用户名不存在"]);
            }
            dump($result["password"]);
            dump(md5($input["password"]));

            if($result["password"] != md5($input["password"])){
                return json(["code"=>$code["password_incorrect"],"msg"=>"密码错误"]);
            }
            $res = $admin->save([
                "password"=>$input["new_password"]
            ],["username"=>$input["username"]]);
            if($res){
                return json(["code"=>$code["edit_success"],"msg"=>"修改成功"]);
            }
            return json(["code"=>$code["unknown_error"],"msg"=>"修改失败"]);
        }catch (\Exception $e){
            return json(["code"=>$code["unknown_error"],"msg"=>$e->getMessage()]);
        }
    }
模型类代码如下namespace app\admin\model;
use think\Model;
class Admin extends Model{
    protected $auto = ["password"];
    protected $insert = ["id"];
    protected $readonly = ["id","username"];
    public function setIdAttr(){
        return md5(uniqid().rand(1000,9999));
    }
    public function setPasswordAttr($password){
        return md5($password);
    }
}
目前我想到的解决办法是将输入的密码进行两次md5加密再比对原密码if($result["password"] != md5(md5($input["password"]))){
      return json(["code"=>$code["password_incorrect"],"msg"=>"密码错误"]);
}
不知道这是tp5的bug还是我学艺不精 (`・ω・´)


最佳答案
评论( 相关
后面还有条评论,点击查看>>