В 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.
Вы можете перезаписать сценарии() в базовом классе AR, чтобы всегда включать update
сценарий с правилами сценария по умолчанию:
public function scenarios() {
$scenarios = parent::scenarios();
if (!isset($scenarios['update'])) {
$scenarios['update'] = $scenarios[self::SCENARIO_DEFAULT];
}
return $scenarios;
}