Yii2:条件安全验证器

Paw*_*wan 5 php jquery yii2

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

我的意思是即使选择其他选项也始终保持安全.

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

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

谢谢.

规则bill_type就像

[['bill_type'], 'string', 'max' => 20],
[['bill_type','test_name','date'], 'required'],
Run Code Online (Sandbox Code Playgroud)

根据doc 编辑安全属性公共属性

$ when - callable - 一个PHP可调用的,其返回值决定是否应该应用此验证器.警予\验证器\验证

$ whenClient - string - 一个JavaScript函数名,其返回值确定是否应在客户端应用此验证程序.警予\验证器\验证

rob*_*sch 4

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

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

除此之外,whenClient您的代码中的 没有意义。这里应该发生什么?

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

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