根据方案设置默认模型值

时间:2015-12-17 22:16:27

标签: php yii2

我无法理清为什么设置默认值对我不起作用。

这是我的控制器:

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,但它不会以这种方式工作。如何根据方案分配默认模型值?

3 个答案:

答案 0 :(得分:1)

Yii仅使用当前场景中的字段。默认情况下,它设置为\yii\base\Model::SCENARIO_DEFAULTdefault)。默认方案包含没有on属性的规则的所有字段。

如果要使用自定义方案,则必须进行设置。您可以通过两种方式实现此目的:

  1. 由构造函数。
    $model = new Query(['scenario'=>'restCreate']);

  2. by setter。
    $model = new Query();
    $mosel->setScenario('restCreate');

  3. 有关方案的详情,请参阅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
}