xukunpeng
我也遇到了这个问题,研究了很长时间,后来决定看源代码。
打开 vendor/yiisoft/yii2/base/Model.phpload()方法调用了setAttributes($values, $safeOnly = true)。
$values就是我们post过来的数据,$safeOnly没有理解,默认true,但是load()在调用setAttributes()没有传递$safeOnly参数,导致默认$safeOnly等于truesetAttributes()方法中有这样一句
$attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());
入托$safeOnly = true 调用 $this->safeAttributes(),否则调用$this->attributes()
这两个方法应该都是返回当前model所定义的字段数组,但是$this->safeAttributes()始终为[],我试了一下$this->attributes()可以正常返回字段数组。所以解决办法:
在load()调用setAttributes()时,传递第二个参数$safeOnly为false,一共两处。$scope = $formName === null ? $this->formName() : $formName; if ($scope === '' && !empty($data)) { $this->setAttributes($data,false); return true; } elseif (isset($data[$scope])) { $this->setAttributes($data[$scope],false); return true; } else { return false; }
再测试成功了。 :)
我一直在使用Laravel这个框架,非常的好用,而且感觉非常专业bug极少(目前我还没遇到过)。我也是刚接触yii这个框架,第一天就卡在了这里,看着官方教程做的。瞬间对这个框架没什么信心了。
正解,亲测成功!!!
- xukunpeng 赞了回答
我也遇到了这个问题,研究了很长时间,后来决定看源代码。
打开 vendor/yiisoft/yii2/base/Model.phpload()方法调用了setAttributes($values, $safeOnly = true)。
$values就是我们post过来的数据,$safeOnly没有理解,默认true,但是load()在调用setAttributes()没有传递$safeOnly参数,导致默认$safeOnly等于truesetAttributes()方法中有这样一句
$attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());
入托$safeOnly = true 调用 $this->safeAttributes(),否则调用$this->attributes()
这两个方法应该都是返回当前model所定义的字段数组,但是$this->safeAttributes()始终为[],我试了一下$this->attributes()可以正常返回字段数组。所以解决办法:
在load()调用setAttributes()时,传递第二个参数$safeOnly为false,一共两处。$scope = $formName === null ? $this->formName() : $formName; if ($scope === '' && !empty($data)) { $this->setAttributes($data,false); return true; } elseif (isset($data[$scope])) { $this->setAttributes($data[$scope],false); return true; } else { return false; }
再测试成功了。 :)
我一直在使用Laravel这个框架,非常的好用,而且感觉非常专业bug极少(目前我还没遇到过)。我也是刚接触yii这个框架,第一天就卡在了这里,看着官方教程做的。瞬间对这个框架没什么信心了。
请问下,config/web.php这个文件是需要自己手动新建吗?是在目录下呢?