Yii 2 创建和更新验证规则遇到问题

问题描述 投票:0回答:1

在 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
常数。

yii2 yii2-model yii2-validation
1个回答
0
投票

您可以在基本 AR 类中覆盖

scenarios()
,以始终包含具有默认场景规则的
update
场景:

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

    return $scenarios;
}
© www.soinside.com 2019 - 2024. All rights reserved.