我有一个自定义验证方法,用于检查字段的标记值,以确保它们都存在于内容中。该方法工作正常,当内容中存在所有令牌时验证为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;
}
答案 0 :(得分:3)
复制并粘贴:
设置字段或字段列表的错误消息。在没有第二个参数的情况下调用时,它将返回指定字段的验证错误。如果不带参数调用,则返回存储在此实体和任何其他嵌套实体中的所有验证错误消息。
// 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: