2017-01-17 117 views
1

我使用Laravel 5.3。我想使用表单验证来测试用户密码的散列。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'); 
} 

这不是工作,即使conditon验证。我测试过这个:

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

但我不明白如何使用它?


SOLUTION:

好,做简单的方式的最佳途径,将化妆前的扩展:

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', 
]); 
+0

它会到达“$ validator-> errors() - > add('end','结束时间必须在三个小时的开始');“ ? –

+0

它显示任何错误 –

+0

是的,它达到。我试着用死('测试!');和死亡是好的。 –

回答

1

您的自定义规则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. 
} 
+0

好的,谢谢你给我这样做的方式。我想在一两行中做出来,不想创建一个新文件。解决方案在我的文章。 –

+0

您的解决方案也是正确的。 – Bugfixer

+0

制作单独文件的目的是您可以在您的多个项目和多个表单请求中使用此代码。这可以防止重复相同的代码。 – Bugfixer

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', 
]);