动态更改CakePHP 3自定义验证规则消息

时间:2016-11-28 10:48:20

标签: php validation cakephp cakephp-3.3

我有一个自定义验证方法,用于检查字段的标记值,以确保它们都存在于内容中。该方法工作正常,当内容中存在所有令牌时验证为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;
}

2 个答案:

答案 0 :(得分:3)

Read the API docs.

复制并粘贴:

EntityTrait ::错误()

  

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

// 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

答案 1 :(得分:1)

不确定burzums回答后这是否有所改进。

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

因此您基本上可以做到这一点:

class kvSerializer(serializers.ModelSerializer):  # please use PascalCase for defining class name
    category = serializers.CharField(source='get_property_type_display')
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    kv_country = serializers.SerializerMethodField()

    class Meta:
        model = kv
        fields = ['title', 'price', 'address', 'category', 'url', 'kv_country']

    def get_kv_country(self, obj):
        return kvSerializerLocation(obj).data

来自Cookbook:

Conditional/Dynamic Error Messages