You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamicModel中DefaultValidator未生效?如何正确设置字段默认值?

问题

在控制器中使用如下代码创建DynamicModel:

$formModel = new \yii\base\DynamicModel(['field']);
$formModel->addRule('field', 'integer',['min'=>1]);
$formModel->addRule('field', 'default',['value'=>20]);
Yii::debug("formModel:".print_r($formModel->attributes,true));

但app.log日志显示:

formModel=Array
(
    [field] => 
)

为何field字段未被初始化为20?如何在DynamicModel中正确使用DefaultValidator?


原因分析

Yii的DefaultValidator(默认验证器)不会自动完成字段初始化,它的生效时机是在验证流程执行期间:当字段值为空(或满足规则中指定的触发条件)时,才会将默认值赋值给字段。你当前的代码仅添加了验证规则,但没有触发验证操作,因此默认值不会被设置到字段上。

解决方法

要让默认值生效,必须触发验证流程,以下是两种可行的方式:

方式一:触发完整验证

调用DynamicModel的validate()方法,触发完整的验证流程,此时DefaultValidator会自动执行并设置默认值:

$formModel = new \yii\base\DynamicModel(['field']);
$formModel->addRule('field', 'integer',['min'=>1]);
$formModel->addRule('field', 'default',['value'=>20]);
// 触发验证,DefaultValidator在此阶段生效
$formModel->validate();
Yii::debug("formModel:".print_r($formModel->attributes,true));

方式二:单独执行默认验证器

如果不需要触发完整的验证流程,可以单独调用DefaultValidator的验证逻辑来设置默认值:

$formModel = new \yii\base\DynamicModel(['field']);
$formModel->addRule('field', 'integer',['min'=>1]);
// 单独创建并执行默认验证器
$defaultValidator = \yii\validators\DefaultValidator::createValidator('default', $formModel, 'field', ['value'=>20]);
$defaultValidator->validate($formModel);
Yii::debug("formModel:".print_r($formModel->attributes,true));

内容的提问来源于stack exchange,提问作者WeSee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:35:20