laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
confirmed
验证字段必须有一个匹配字段 foo_confirmation,例如,如果验证字段是 password,必须输入一个与之匹配的 password_confirmation 字段。
same:field
给定字段和验证字段必须匹配
protected$fillable=['name','password'];
publicstatic$rules=[
'name'=>'required|unique:managers',
'password'=>'required|confirmed',
'password_confirmation'=>'required|same:password'
];
publicstaticfunctionerror_message()
{
return[
'name.required'=>__('tyvalidation.name'),
'name.unique'=>__('tyvalidation.unique'),
'password.required'=>__('tyvalidation.password'),
'password.confirmed'=>__('tyvalidation.confirmed'),
];
}
publicfunctionsetPasswordAttribute($value)
{
$this->attributes['password']=Hash::make($value);
}
经验证,上面的验证方式在update的时候会出问题,修改的时候会验证unique,导致不能保存,所以需要修改下。
官网说:
Sometimes,youmaywishtoignoreagivenIDduringtheuniquecheck.Forexample,consideran"updateprofile"screenthatincludestheuser'sname,e-mailaddress,andlocation.Ofcourse,youwillwanttoverifythatthee-mailaddressisunique.However,iftheuseronlychangesthenamefieldandnotthee-mailfield,youdonotwantavalidationerrortobethrownbecausetheuserisalreadytheownerofthee-mailaddress.
Toinstructthevalidatortoignoretheuser'sID,we'llusethe Rule classtofluentlydefinetherule.Inthisexample,we'llalsospecifythevalidationrulesasanarrayinsteadofusingthe |charactertodelimittherules:
重要的2句话是:
有时,您可能希望在唯一检查期间忽略给定的ID。
当然,您需要验证电子邮件地址是否唯一。但是,如果用户仅更改名称字段而不更改电子邮件字段,则不希望抛出验证错误,因为用户已经是电子邮件地址的所有者,为了指示验证者忽略用户的ID,我们将使用Rule该类来流畅地定义规则。
useIlluminate\Validation\Rule;
Validator::make($data,[
'email'=>[
'required',
Rule::unique('users')->ignore($user->id),
],
]);
所以修改为
'name'=>[
'required',
Rule::unique('managers')->ignore($id),
],
在更新密码时,我们需要验证旧的密码是否正确,那我们需要使用自定义验证。
UsingClosures
Ifyouonlyneedthefunctionalityofacustomruleoncethroughoutyourapplication,youmayuseaClosureinsteadofaruleobject.TheClosurereceivestheattribute'sname,theattribute'svalue,anda $fail callbackthatshouldbecalledifvalidationfails:
Closure接收属性的名称,属性的值以及$fail在验证失败时应调用的回调。
$validator=Validator::make($request->all(),[
'title'=>[
'required',
'max:255',
function($attribute,$value,$fail){
if($value==='foo'){
return$fail($attribute.'isinvalid.');
}
},
],
]);
所以密码是否正确可以这样验证
'old_password'=>[
'required',
function($attribute,$value,$fail)use($manager)
{
if(!Hash::check($value,$manager->password))
{
return$fail(__('tyvalidation.old_password'));
}
},
],
所有代码如下:
create.html
T