yii2中model使用load方法

首先说一下以往的yii2开发中model是怎样接收数据的。

  1. $member->load($params);
  2. $member->attributes = $params;
  3. $member->setAttributes($params);

但是现在前后端分离的背景下,我们可能会遇到$model不能被正确赋值的情况。究其原因,有两个。

一是看load方法最后还是调用了setAttributes方法,所以可以在setAttributes里面查看原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Sets the attribute values in a massive way.
* @param array $values attribute values (name => value) to be assigned to the model.
* @param bool $safeOnly whether the assignments should only be done to the safe attributes.
* A safe attribute is one that is associated with a validation rule in the current [[scenario]].
* @see safeAttributes()
* @see attributes()
*/
public function setAttributes($values, $safeOnly = true)
{
if (is_array($values)) {
$attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());
foreach ($values as $name => $value) {
if (isset($attributes[$name])) {
$this->$name = $value;
} elseif ($safeOnly) {
$this->onUnsafeAttribute($name, $value);
}
}
}
}

源码注释中可以看到,第二个参数safeOnly表示:是否应该只对安全属性进行赋值。所以,我们可以使safeOnly为false,问题就可以解决了。

1
$member->setAttributes($params, false);

第二个原因是使用load方法时,前端不是使用yii Form提交数据。
解决方法:

1
$member->load($params, '');

具体原因分析详见下方的参考。

参考:Yii load方法小探&&感受思想