После того, как определены правила валидации для полей формы, можно столкнуться с проблемой. Лично у меня проблема была следующая. Загрузка картинки обязательна. При создании записи всё работает отлично, но вот при редактировании записи у меня опять же срабатывает валидация и поэтому модель само собой не сохраняется. Здесь необходимо воспользоваться валидацией по сценарию. В данной заметке я покажу простой пример валидации по сценарию путем переопределения метода yii\base\Model::scenarios().

Способ #1

Добавить в модель константу:

const SCENARIO_CREATE_POST = 'create_post';

Добавить в правила rules():

// Поле обязательно к заполнению если используется сценарий 'create_post' 
['image', 'required', 'on' => self::SCENARIO_CREATE_POST]

В методе actionCreate() контроллера PostController:

$model = new Post(['scenario' => Post::SCENARIO_CREATE_POST]);

// Или
$model = new Post();
$model->scenario = $model::SCENARIO_CREATE_POST;

Теперь поле image будет обязательным для заполнении только при создании записи.

Способ #2

Добавить в модель константу:

const SCENARIO_UPDATE_POST = 'update_post';

Добавить в правила rules():

// Поле обязательно, но валидацию исключить по данному сценарию 
['image', 'required', 'except' => self::SCENARIO_UPDATE_POST]

В методе actionUpdate() контроллера PostController:

$model = $this->findModel($id);
$model->scenario = $model::SCENARIO_UPDATE_POST;

Здесь поле image будет так же обязательным для заполнении только при создании записи. (except - за исключением обновления записи).

Способ #3

Данный способ основан на официальной документации

Добавить в модель константу:

const SCENARIO_UPDATE_POST = 'update_post';

Добавить в правила rules():

// Поле обязательно к заполнению 
['image', 'required']

Добавить метод scenarios():

public function scenarios()
{
  $scenarios = parent::scenarios();
  // Валидация по указанному сценарию применяется только для поля "name"
  $scenarios[self::SCENARIO_UPDATE_POST] = ['name'];
  return $scenarios;
}

Или так:

public function scenarios()
{
  return ArrayHelper::merge(parent::scenarios(), [
    self::SCENARIO_UPDATE_POST => ['name']
  ]);
}