Возникли проблемы с правилами проверки Yii 2 для создания и обновления

В Yii 1 новый экземпляр модели активной записи автоматически имел scenario из 'insert', а модель активной записи, полученная из базы данных, автоматически имела scenario из 'update'. Я нашел это очень интуитивно понятным и полезным.

В Yii 2 модели активных записей всегда имеют scenario из 'default', если только мы вручную не задали другой сценарий. Я не понимаю, почему было принято это дизайнерское решение, поэтому моя проблема может заключаться в том, что мне нужна помощь в понимании этого.

По моему опыту, правила проверки, естественно, будут немного отличаться для новых и существующих записей (то есть создания и обновления), поэтому я добавил код для автоматической установки scenario для моих активных моделей записей Yii 2 на 'update' после того, как я их получу. из базы данных (выполняется путем ответа на событие after-find). Это облегчает мне использование некоторых правил проверки, которые применяются как к созданию, так и к обновлениям, некоторые — только к созданию, а некоторые — только к обновлениям.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что любые модели, которые не имеют каких-либо правил, применимых только к обновлению (то есть не имеют никаких 'on' => 'update' правил), выдают исключение Unknown scenario: update. Я ожидал, что они просто будут применять правила, применимые ко всем сценариям.

Вопрос:
Есть ли простой способ заставить Yii 2 принять мой 'update' сценарий даже для моделей, у которых нет пользовательских 'on' => 'update' правил? Или я как-то неправильно об этом думаю?

Я хотел бы избежать добавления фиктивного правила с 'on' => 'update', и я обеспокоен тем, что добавление пустой записи «обновления» в массив, возвращаемый scenarios(), не приведет к применению ни одного из правил проверки.

Я прочитал этот выпуск Yii 2, и похоже, что кто-то другой столкнулся с проблемой, очень похожей на ту, с которой столкнулся я. Несмотря на то, что он объяснил причину создания исключения для неизвестных сценариев, все же кажется более интуитивным применить правила, которые будут применяться к этому сценарию (например, все правила без специального списка on, исключающего неизвестный сценарий, и без списка except, который указывает неизвестный сценарий).

В качестве примечания: чтобы избежать необходимости вручную устанавливать сценарий и для новых моделей активных записей, мы используем константу CREATE со значением 'default', чтобы новые модели активных записей автоматически имели сценарий, соответствующий нашей константе CREATE.

🤔 А знаете ли вы, что...
Yii предоставляет интеграцию с различными системами контроля версий, такими как Git.


58
1

Ответ:

Решено

Вы можете перезаписать сценарии() в базовом классе AR, чтобы всегда включать update сценарий с правилами сценария по умолчанию:

public function scenarios() {
    $scenarios = parent::scenarios();
    if (!isset($scenarios['update'])) {
        $scenarios['update'] = $scenarios[self::SCENARIO_DEFAULT];
    }

    return $scenarios;
}