zoukankan      html  css  js  c++  java
  • 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 传过来就可以了。

  • 相关阅读:
    安卓查询当前所在地天气及查询地区(城市)代码cityCode localCode
    文件读写IO
    【桌面虚拟化】之三 Persistent vs NonP
    Android软件开发之常用系统控件界面整理
    Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面
    Java之Static静态修饰符详解
    OWASP
    2001中美黑客大战
    能"干掉"苹果的中国"黑客"
    Roy Li的学习和成长自传
  • 原文地址:https://www.cnblogs.com/afee666/p/6882311.html
Copyright © 2011-2022 走看看