0

我有一个自定义验证方法,可以检查字段中的令牌值,以确保它们都存在于内容中。该方法工作正常,当所有令牌都存在于内容中时它验证为 OK,并在缺少一个或多个令牌时引发验证错误。

当我将自定义验证规则附加到validationDefault(). 但是,我真正想做的是设置一个验证消息,以反映哪些令牌尚未设置。如何在 CakePHP 3 中动态设置验证消息?在 CakePHP 2 中,我曾经用来$this->invalidate()应用适当的消息,但这似乎不再是一个选项。

我的代码看起来像这样(我已经去掉了我的实际令牌检查,因为它与这里的问题无关):-

public function validationDefault(Validator $validator)
{
    $validator
        ->add('content', 'custom', [
            'rule' => [$this, 'validateRequiredTokens'],
            'message' => 'Some of the required tokens are not present'
        ]);

    return $validator;
}

public function validateRequiredTokens($check, array $context)
{
    $missingTokens = [];

    // ... Check which tokens are missing and keep a record of these in $missingTokens ...

    if (!empty($missingTokens)) {
        // Want to update the validation message here to reflect the missing tokens.
        $validationMessage = __('The following tokens are missing {0}', implode(',', $missingTokens));

        return false;
    }

    return true;
}
4

2 回答 2

3

阅读 API 文档。

复制和粘贴:

EntityTrait::errors()

设置字段或字段列表的错误消息。在没有第二个参数的情况下调用它会返回指定字段的验证错误。如果不带参数调用,它将返回存储在此实体和任何其他嵌套实体中的所有验证错误消息。

// Sets the error messages for a single field
$entity->errors('salary', ['must be numeric', 'must be a positive number']);

// Returns the error messages for a single field
$entity->errors('salary');

// Returns all error messages indexed by field name
$entity->errors();

// Sets the error messages for multiple fields at once
$entity->errors(['salary' => ['message'], 'name' => ['another message']);

http://api.cakephp.org/3.3/class-Cake.Datasource.EntityTrait.html#_errors

于 2016-11-28T11:04:47.663 回答
1

不确定这是否是自 burzum 回答以来有所改进的东西。

但这实际上很简单。自定义验证规则可以返回 true(如果验证成功)、false(如果不成功),但您也可以返回字符串。该字符串被解释为假,但用于错误消息。

所以你基本上可以这样做:

public function validationDefault(Validator $validator)
{
    $validator
    ->add('content', 'custom', [
        'rule' => [$this, 'validateRequiredTokens'],
        'message' => 'Some of the required tokens are not present'
    ]);

    return $validator;
}

public function validateRequiredTokens($check, array $context)
{
     $missingTokens = [];

     if (!empty($missingTokens)) {
         // Want to update the validation message here to reflect the missing tokens.
         $validationMessage = __('The following tokens are missing {0}', implode(',', $missingTokens));

         //Return error message instead of false
         return $validationMessage;
     }

     return true;
}

来自食谱:

条件/动态错误消息

于 2019-08-29T08:49:15.387 回答