Yii2.0 下的 load() 方法的使用

一 问题

最近在使用 Yii2.0,遇到一个 bug:在 /models/OrderDetail.php add() 方法中调用 load() 方法加载数据,却加载不了。

public function add($data)
{
    if ($this->load($data) && $this->save()) {
        return true;
    }
    return false;
}

二 排错

2.1 将 add() 方法修改成如下(添加 $this->getErrors()):

public function add($data)
{
    if (!$this->load($data) ) {
        var_dump($this->getErrors()); echo 'load'; exit;
    }
    if (!$this->save() ) {
        var_dump($this->getErrors()); echo 'save'; exit;
    }
    return false;
}

浏览器显示 "array(0){}load"。说明确实是 load() 方法加载不了数据。

2.2 查看 load() 方法源码:

public function load($data, $formName = null)
{
    $scope = $formName === null ? $this->formName() : $formName;
    if ($scope === '' && !empty($data)) {
        $this->setAttributes($data);
        return true;
    } elseif (isset($data[$scope])) {
        $this->setAttributes($data[$scope]);
        return true;
    } else {
        return false;
    }
}

主要看 formName() 方法。该方法通过类反射返回与模型名对应的表单名。在 load() 方法中,在通过 $this->formName() 获得 $scope 的值后,就会判断变量 $data[$scope] 是否存在,若是就会返回真,否则返回假。由于变量 $data[$scope] 确实不存在,所以导致了 bug 的产生。

三 解决方法

3.1 可以将 add() 方法修改成如下:

public function add($data)
{
    // OrderDetail 是模型名
    if ($this->load(['OrderDetail' => $data]) && $this->save()) {
      return true;
    }
    return false;
}

3.2 不修改 add() 方法,而是在对应的控制器里修改传给模型的 $data,将其修改为 $data['OrderDetail'] = $data; 再将 $data 传过来就可以了。

 

posted on 2017-05-20 15:53  afee666  阅读(3886)  评论(0编辑  收藏  举报

导航