【问题标题】:Laravel 5.3 use custom validationLaravel 5.3 使用自定义验证
【发布时间】:2017-06-01 13:35:01
【问题描述】:

我使用 Laravel 5.3。我想使用表单验证来测试用户密码的哈希值。

这是我的代码:

$validator = Validator::make($request->all(), [
    'old_password' => 'required|max:20|min:6',
    'new_password' => 'required|max:20|min:6',
    'new_password_confirm' => 'required|same:new_password',
]);

// test old password
if (! Hash::check($request->old_password, $user->user_passwd)) {
    $validator->errors()->add('end', 'The end time must be within three hours of the start');
}

这不起作用,即使条件得到验证。我已经测试过了:

Validator::extend('old_password', function($attribute, $value) use ($user) {
    return Hash::check($value, $user->user_passwd);
});

但是我不明白这个怎么用?


解决方案:

好的,最好的方法是简单的,把extend放在make之前:

Validator::extend('checkPassword', function ($attribute, $value, $parameters, $validator) use($user) {
     return Hash::check($value, $user->user_passwd);
}, 'Your message error !');

$validator = Validator::make($request->all(), [
     'old_password' => 'required|max:20|min:6|checkPassword',
     'new_password' => 'required|max:20|min:6',
     'new_password_confirm' => 'required|same:new_password',
]);

【问题讨论】:

  • 是否达到" $validator->errors()->add('end', '结束时间必须在开始的三小时内');" ?
  • 它显示任何错误
  • 是的,它到达了。我尝试用 die('test !');死掉就好了。
  • 不,只是验证器不会失败,即使 old_password 不是好密码。
  • old_password 现在是自定义验证。所以你可以使用像'password' => 'old_password'这样的规则。这将接受密码参数。

标签: php laravel


【解决方案1】:

我找到了解决方案。以简单的方式做到这一点的最好方法是将扩展放在 make 之前:

Validator::extend('checkPassword', function ($attribute, $value, $parameters, $validator) use($user) {
     return Hash::check($value, $user->user_passwd);
}, 'Your message error !');

$validator = Validator::make($request->all(), [
     'old_password' => 'required|max:20|min:6|checkPassword',
     'new_password' => 'required|max:20|min:6',
     'new_password_confirm' => 'required|same:new_password',
]);

【讨论】:

    【解决方案2】:

    你的自定义规则 old_password 可以这样使用

    $validator = Validator::make($request->all(), [
        'old_password' => 'required|max:20|min:6|checkpassword',
        'new_password' => 'required|max:20|min:6',
        'new_password_confirm' => 'required|same:new_password',
    ]);
    

    扩展验证器。 CheckPassword 是带有方法 isValid() 的类。

    Validator::extend('checkpassword', function ($attribute, $value, $parameters, $validator) {
                return (new CheckPassword($attribute, $value, $parameters, $validator))->isValid();
            });
    

    CheckPassword.php 会像

    /**
     * Attribute being tested
     *
     * @var mixed
     */
    protected $attribute;
    
    /**
     * Value of the attribute
     *
     * @var mixed
     */
    protected $value;
    
    /**
     * Array of parameters passed to the value
     *
     * @var array
     */
    protected $parameters;
    
    /**
     * Validator instance
     *
     * @var mixed
     */
    protected $validator;
    /**
     * Class constructor
     *
     * @param mixed $attribute
     * @param Uploaded $value
     * @param array $parameters
     * @param mixed $validator
     */
    public function __construct($attribute, $value, $parameters, $validator)
    {
        $this->attribute = $attribute;
        $this->value = $value;
        $this->parameters = $parameters;
        $this->validator = $validator;
    }
    
    public function isValid()
    {
      $value = $this->value; //Old password Value
      //after this you can check hash and return true or false.
    }
    

    【讨论】:

    • 好的,谢谢你给我方法。我想在一/两行中完成它,不想创建一个新文件。我的帖子中的解决方案。
    • 制作单独文件的目的是您可以在您的多个项目和多个表单请求中使用此代码。这可以防止重复相同的代码。
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2017-01-24
    • 1970-01-01
    • 2012-11-27
    • 2017-05-21
    • 2017-04-11
    • 2014-04-22
    • 2015-05-10
    相关资源
    最近更新 更多