阅读 CakePHP 3.x 中的验证规则 属性 以便在 js 函数中使用

Read property of a validation rule in CakePHP 3.x for use in a js function

我的一个 Table class 中有一个验证规则,如下所示:

public function validationDefault(Validator $validator)
{
    $validator
        ->scalar('comment')
        ->maxLength('comment', 3000)
        ->requirePresence('comment', 'create')
        ->notEmpty('comment');

    return $validator;
}

这会验证输入的 comment 字段,这意味着它的长度不能超过 3000 个字符。在 PHP.

中工作时,所有这些都很好

我的应用程序的一部分使用 JavaScript 字符计数器 - 它告诉用户在键入时他们在字段中剩余的字符数。这个 js 工作正常,限制 3000 硬编码。

但是,我想知道是否有办法避免在我的 js 中硬编码此限制?因为否则我的代码不是 DRY,因为我在多个地方定义了 3000 限制,如果它改变了 remember/update.

就会有问题

是否可以直接从 validationDefault 中读取 maxLength 属性 的 comment 字段?这个问题涉及如何访问Table class中定义的数据;我很清楚如何通过 ajax.

将它传递给 js

我没有任何进一步的代码可以显示,因为我不知道 if/how 这甚至是可能的。

蛋糕PHP 3.5.13

要获取验证规则值,您必须从 Table 获取 Validator,然后获取 ValidationSet,然后是 ValidationRule,您可以从中提取所需的结果.下面的示例控制器代码:

$validator = $this->YourTable->getValidator("default");
$validationSet = $validator->field("comment");
$validationRule = $validationSet->rule("maxLength");
$result = $validationRule->get("pass");

或者,仅在一行中:

$result = $this->YourTable->getValidator("default")->field("comment")->rule("maxLength")->get("pass");

返回值将是传递给验证规则的附加参数数组,在您的情况下它应该如下所示:

array(1) {
  [0]=>
      int(3000)
}

此外,@ndm 在他的回答中提到了其他可能性:

On form helper/context level it's also possible to read the schema, and support for transalting its length configuration and the validation rule value into a maxlength HTML attribute is being implemented for CakePHP 3.7

延伸阅读:

Getting validators from tables

Validator class

ValidationSet class

ValidationRule class