我无法理清为什么设置默认值对我不起作用。
这是我的控制器:
class QueryController extends ActiveController
{
public $modelClass = 'app\models\Query';
public $createScenario = 'restCreate';
public $updateScenario = 'restUpdate';
我不会覆盖默认的createAction
方法。
型号:
class Query extends ActiveRecord
{public function rules()
{
return [
[['userId', 'name', 'created', 'isOneTime', 'isArchived', 'settings', 'engine'], 'required'],
[['userId'], 'integer'],
[['name', 'settings', 'schedule'], 'string'],
[['created', 'lastUpdate'], 'safe'],
[['isOneTime', 'isArchived', 'isApi', 'valid'], 'boolean'],
[['state', 'engine'], 'string', 'max' => 160],
[['isApi'], 'default', 'value'=> false],
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['restCreate'] = ['name', 'state', 'isApi', 'isOneTime', 'settings', 'schedule'];
$scenarios['restUpdate'] = ['name', 'state', 'isOneTime', 'settings', 'schedule' ];
return $scenarios;
}
当我通过Rest控制器创建一个新条目时,它应该默认设置isApi = true
,但它不会以这种方式工作。如何根据方案分配默认模型值?
答案 0 :(得分:1)
Yii仅使用当前场景中的字段。默认情况下,它设置为\yii\base\Model::SCENARIO_DEFAULT
(default
)。默认方案包含没有on
属性的规则的所有字段。
如果要使用自定义方案,则必须进行设置。您可以通过两种方式实现此目的:
由构造函数。
$model = new Query(['scenario'=>'restCreate']);
by setter。
$model = new Query();
$mosel->setScenario('restCreate');
有关方案的详情,请参阅this link。
P.S。良好做法是使用常量作为方案名称。它可以帮助您减少场景名称中的错误。例如:
class Query extends ActiveRecord {
const SCENARIO_REST_CREATE = 'restCreate';
const SCENARIO_REST_UPDATE = 'restUpdate';
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[static::SCENARIO_REST_CREATE ] = [/*...*/];
$scenarios[static::SCENARIO_REST_UPDATE ] = [/*...*/];
return $scenarios;
}
}
答案 1 :(得分:1)
你应该改变这个规则:
[['isApi'], 'default', 'value'=> false]
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']
您必须执行此操作,因为DefaultValueValidator
仅对单个字段应用一次。仅当字段的值为空时,此验证程序才会运行。有这个检查:\yii\validators\DefaultValueValidator::validateAttribute()
模型逐个运行验证器。 [['isApi'], 'default', 'value'=> false]
将字段值设置为false
。 [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']
看到该值不为空并跳过。
答案 2 :(得分:0)
在你的行动中:
public function ActionCreate(){
$model->scenario = 'restCreate';// it will set your scenario first .
//remaining code for write here
}