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