在 Yii 1 中,活动记录模型的新实例自动具有
scenario
的 'insert'
,从数据库检索的活动记录模型自动具有 scenario
的 'update'
。我发现这非常直观且有帮助。
在 Yii 2 中,活动记录模型的
scenario
始终为 'default'
,除非我们手动设置不同的场景。我不明白为什么做出这个设计决定,所以我的问题可能是需要帮助理解这一点。
根据我的经验,新记录与现有记录(又名创建与更新)的验证规则自然会略有不同,因此我添加了代码来自动将我的 Yii 2 活动记录模型的
scenario
设置为 'update'
在我从数据库中检索它们之后(通过响应后查找事件完成)。这使我更容易拥有一些适用于创建和更新的验证规则,一些仅适用于创建,一些仅适用于更新。
我现在遇到的问题是,任何没有任何 only 适用于更新的规则(又名没有任何
'on' => 'update'
规则)的模型都会抛出 Unknown scenario: update
异常。我本以为他们会简单地应用适用于所有场景的规则。
问题:
有没有一种简单的方法让 Yii 2 接受我的
'update'
场景,即使对于没有自定义 'on' => 'update'
规则的模型?还是我的想法是错误的?
我想避免添加带有
'on' => 'update'
的虚拟规则,并且我担心向 scenarios()
返回的数组添加空的“更新”条目将导致不应用任何验证规则。
我已经通读了这个 Yii 2 问题,听起来就像其他人遇到了与我遇到的问题非常相似的问题。虽然它确实解释了针对未知场景抛出异常的原因,但应用适用于该场景的规则似乎仍然更直观(例如,所有没有自定义
on
列表(排除未知场景且没有 )的规则except
指定未知场景的列表)。
顺便说一句,为了避免也为新的活动记录模型手动设置场景,我们使用值为
CREATE
的 'default'
常量,以便新的活动记录模型自动具有与我们的场景匹配的场景CREATE
常数。
scenarios()
,以始终包含具有默认场景规则的 update
场景:
public function scenarios() {
$scenarios = parent::scenarios();
if (!isset($scenarios['update'])) {
$scenarios['update'] = $scenarios[self::SCENARIO_DEFAULT];
}
return $scenarios;
}