Yii2模型验证失效求助:REST API Excel行验证异常
Yii2模型验证异常排查:加载数组后所有必填字段均报空错误
问题场景
作为Yii2新手,开发支持Excel上传的REST API时,逐行验证Excel数据遇到异常:明明部分字段已赋值,调用$model->validate()后却返回所有必填字段的空值错误。
数据加载代码
$data = array( "firstName" => 'asdjqkw', "lastName" => '', "email" => 'ansm@', "companyName" => 'ddq', "address_1" => '', "address_2" => 'aas', "country" => '', "state" => 'New Brunswick', "city" => '87875', "zip" => '484527', ); $model->load($data); if (!$model->validate()) { $validation = $model->errors; }
模型规则与标签
public function rules() { return [ [['firstName', 'lastName', 'email', 'companyName', 'address_1', 'country', 'state', 'city', 'zip'], 'required'], ['email', 'email'], [['firstName', 'lastName', 'email', 'companyName', 'address_1', 'country', 'state', 'city', 'zip'], 'string', 'max' => 250], ]; } public function attributeLabels() { return [ "firstName" => 'First Name', "lastName" => 'Last Name', "email" => 'Email', "companyName" => 'Company Name', "address_1" => 'Address 1', "country" => 'Country', "state" => 'State', "city" => 'City', "zip" => 'Zip', ]; }
返回的验证错误
"firstName": [ "First Name cannot be blank." ], "lastName": [ "Last Name cannot be blank." ], "email": [ "Email cannot be blank." ], "companyName": [ "Company Name cannot be blank." ], "address_1": [ "Address 1 cannot be blank." ], "country": [ "Country cannot be blank." ], "state": [ "State cannot be blank." ], "city": [ "City cannot be blank." ], "zip": [ "Zip cannot be blank." ]
问题原因
Yii2的load()方法默认要求数据数组带模型类名前缀(比如['User' => ['firstName' => 'xxx']]),直接传一维数组时,load()会因找不到对应模型的属性组,导致所有属性都没被正确赋值,最终validate时判定所有字段为空。
解决方案
方法1:修改load()调用,跳过前缀检查
把$model->load($data);改成:
$model->load($data, '');
load()的第二个参数为场景名,传空字符串时会直接将一维数组的键映射到模型属性,无需前缀。
方法2:给数据数组添加模型类名前缀
如果要保留load()默认行为,需将数据包装成带模型类名的二维数组:
$data = [ 'YourModelClassName' => [ // 替换为你的实际模型类名,比如User "firstName" => 'asdjqkw', "lastName" => '', "email" => 'ansm@', "companyName" => 'ddq', "address_1" => '', "address_2" => 'aas', "country" => '', "state" => 'New Brunswick', "city" => '87875', "zip" => '484527', ] ]; $model->load($data);
验证效果
修改后,模型会正确赋值已有数据,validate只会返回真正为空的字段(如lastName、address_1、country)以及格式错误的字段(如email格式无效)的错误。
内容的提问来源于stack exchange,提问作者Khatri Pavan
相关产品推荐
相关产品推荐

