【问题标题】:Yii2: safe validator on conditionYii2:有条件的安全验证器
【发布时间】:2015-06-05 08:15:21
【问题描述】:

我正在尝试在我的模型中使用此验证规则,但它不起作用。

我的意思是,即使选择其他选项,它也始终是安全的。

[['dhanwantri_bill_number'], 'safe', 
    'when' => function($model) {
        return $model->bill_type =='d';                 
    },
    'whenClient' => "function (attribute, value) {
                         return $('#opdtestbill-bill_type').val() == 'd';
                     }"
],

我做错了吗? 是否有任何替代解决方案来实现相同的目标。

谢谢。

bill_type 的规则类似于

[['bill_type'], 'string', 'max' => 20],
[['bill_type','test_name','date'], 'required'],

编辑 根据文档的安全属性公共属性

$when - callable - 一个 PHP 可调用对象,其返回值决定 是否应应用此验证器。 yii\validators\Validator

$whenClient - 字符串 - 返回值的 JavaScript 函数名 确定此验证器是否应应用于客户端 边。 yii\validators\Validator

【问题讨论】:

  • 这个属性还有其他规则吗?
  • 您真的要使用“安全”验证器吗? DocSafeValidator 充当虚拟验证器,其主要目的是标记属性以确保大规模分配是安全的。 所以如果 bill_type 为 'd',你想禁止分配 dhanwantri_bill_number 吗?跨度>
  • @topherkanyuga - 不,我对此属性没有其他规则。
  • 啊,好吧。我以为...

标签: php jquery yii2


【解决方案1】:

由于“安全”验证器只是告诉我们可以通过大量赋值来设置属性,因此这种方法并不合适。它只是说当您使用load() 方法时,该属性可以获得一个值。如果没有标记为“安全”,它不会阻止设置一个值,例如$model->dhanwantri_bill_number = 'asdf'。所以这不是一个合适的解决方案。

更准确地说:当$model->validate()(通常用$model->save() 调用)被调用时,'safe' 属性不起作用。它仅在调用$model->load() 时使用。如果您查看 source code of the SafeValidatior 类,您会发现此验证器没有任何反应。验证器不做任何事情。它只是一个标记(您可能想将其与例如RequiredValidator 进行比较)。对于load(),不使用“when”表达式。所以你可以说'safe'不能和'when'一起使用。评估规则时可能会使用安全验证器,但其 validateAttribute() 为空,因此在该时间点不会发生任何事情。

除了代码中的whenClient 没有意义。这里应该发生什么?

我想有几种方法可以实现这一点。一种想法是让控制器不通过 load() 设置属性,而是明确设置它们并检查是否应该设置 $model->dhanwantri_bill_number。或者你可以使用load(),然后根据$model->bill_type的设置在加载后恢复属性。

或者您可以在模型中为 dhanwantri_bill_number 实现一个 setter 方法,并在该属性是否被设置时选择该方法。也许取决于场景。

【讨论】:

  • 但是文档说safe validator 这些公共属性可以作为callable 使用——我已经在我的问题中添加了这些属性。
  • 所以“安全”不适用于“何时”,所以我应该假设文档中提到的内容不正确吗?正如在文档中明确提到的那样,when 可用于safe
  • @Pawan 是的,'何时'在那里。但是安全验证器只对 load() 有影响。并且在加载时,模型只查看哪些属性是验证规则的一部分(所有提到的属性(当前场景的),没有'!'前缀)。它不会在该步骤中评估“何时”表达式。当调用模型的 validate() 方法时会发生这种情况。这已经为时已晚。 IMO 文档缺少 SafeValidator 类。
【解决方案2】:

来自 Yii2 文档:

默认情况下,活动属性被认为是安全的并且可以被大量分配。如果一个属性不应该被大量分配(因此被认为是不安全的),请在属性前加上一个感叹号(例如'!rank')。

考虑使用场景来处理您的问题。 http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2015-04-29
    • 2017-01-06
    • 2017-04-17
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多