将自定义验证规则作为字符串传递并获取所有验证消息

Posted

技术标签:

【中文标题】将自定义验证规则作为字符串传递并获取所有验证消息【英文标题】:Pass a custom validation rule as a string and get all validation messages 【发布时间】:2021-08-08 18:24:27 【问题描述】:

我正在构建一个需要用户注册的 Laravel 8 应用。作为注册的一部分,我需要用户提供强密码(最少字符,大小写字母、数字和符号)。

另外,为方便起见,注册请求的规则存储在数据库中,这意味着我无法将上述规则作为对象提供,例如:['required', Password::min(8)->letters()->mixedCase()->numbers()->symbols()],只能作为字符串:'required,strong_password'。为此,我使用上述规则扩展了 Validator:

Validator::extend('strong_password', Password::min(8)
      ->letters()
      ->mixedCase()
      ->numbers()
      ->symbols());

一切正常,但是当验证失败时,它只提供一条错误消息(validation.strong_password,我可以翻译)。

我希望能够利用密码规则提供的所有消息。这些可以使用类的 message() 方法获得,该方法永远不会被调用,因为只有当规则作为实例 Rule 的对象传递时才会发生这种情况(参见 vendor/laravel/framework/src/Illuminate/Validation/Validator.php:562):

if ($rule instanceof RuleContract) 
  return $validatable
    ? $this->validateUsingCustomRule($attribute, $value, $rule)
    : null;


protected function validateUsingCustomRule($attribute, $value, $rule) 
  // some code

    $messages = $rule->message();

  // mode code


问题是:如何注册自定义规则并将其作为字符串存储在数据库中,以便从它的 message() 方法中受益,该方法仅在规则作为对象传递时调用?

【问题讨论】:

【参考方案1】:

我建议按照 laravel doc 使用 costome 验证

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()

    return [
        'password' => 'required|min:8',

    ];

希望对你有用

【讨论】:

规则存储在数据库中。此外,我想要混合大小写、数字和符号以及 Password 提供的所有失败消息。 虽然有简单的方法可以让生活变得复杂。首先,您不应该将消息存储在数据库中,而您可以将它们写入字符串,因为这会使您的应用程序变得缓慢而沉重。如果你必须这样做。您必须从验证模型中获取数据并作为变量调用,这比简单地传递字符串更耗时且浪费您的时间 我没有将消息存储在数据库中。我将规则存储在数据库中,这允许客户端编辑表单和验证。

以上是关于将自定义验证规则作为字符串传递并获取所有验证消息的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 JsonConverter 添加到 Web API 会影响传递给自定义验证属性的字符串值

Kendo Upload Control,将自定义错误消息传回查看

将自定义验证错误消息按元素合并到表单对象中

如何将自定义消息添加到 Firebase Google 身份验证弹出窗口?

为自定义验证规则命名 - Laravel 8

带有错误消息的自定义验证器的 angularjs 指令