Laravel用户无法单独更新个人资料的问题及修复方案
Laravel个人资料更新需强制上传头像问题修复
问题场景
Laravel项目里的个人资料更新功能存在限制:用户无法单独修改姓名这类信息,必须同时上传新头像,系统才会接受并保存修改。原控制器的storePersonalInfo方法代码如下:
public function storePersonalInfo(Request $request, $lang){ $this->validate($request, [ 'avatar' => 'required|mimes:jpeg,jpg,png', 'firstName' => 'required', 'lastName' => 'required' ]); $user = Auth::user(); $file = $request->file('avatar'); $filename = hash('sha1',$file->getClientOriginalName().'-'.time()).'.'.$file->getClientOriginalExtension() ; $filePath = 'users/'. Auth::user()->name.'/'.$filename; $image = Image::make($file); $image->fit(200, 200); if (Storage::put($filePath, (string) $image->encode())) { $user->avatar = Storage::url($filePath); }else{ return back(); } $user->first_name = $request->firstName; $user->last_name = $request->lastName; $user->save(); flash(__('Profile info updated with success '), 'success'); return back(); }
修复方案
通过调整验证规则和逻辑分支,解决了必须上传头像才能更新资料的问题,修复后的storePersonalInfo方法代码如下:
public function storePersonalInfo(Request $request, $lang){ $this->validate($request, [ 'avatar' => 'sometimes|required|mimes:jpeg,jpg,png', 'firstName' => 'sometimes|required', 'lastName' => 'sometimes|required' ]); $user = Auth::user(); if ($file = $request->file('avatar')) { $filename = hash('sha1',$file->getClientOriginalName().'-'.time()).'.'.$file->getClientOriginalExtension() ; $filePath = 'users/'. Auth::user()->name.'/'.$filename; $image = Image::make($file); $image->fit(200, 200); if (Storage::put($filePath, (string) $image->encode())) { $user->avatar = Storage::url($filePath); } $user->first_name = $request->firstName; $user->last_name = $request->lastName; $user->save(); flash(__('Profile Updated'), 'success'); return back(); } else { $user->first_name = $request->firstName; $user->last_name = $request->lastName; $user->save(); flash(__('Profile Updated'), 'success'); return back(); } }
修复思路
- 调整验证规则:将原规则中的
required改为sometimes|required,字段仅在请求中存在时才需要满足必填和格式要求,不存在时不触发验证。 - 拆分逻辑分支:增加条件判断,分别处理「有头像上传」和「无头像上传」的场景,无论用户是否上传新头像,只要提交了有效信息就能完成更新,实现单独修改资料或单独更换头像的功能。
内容的提问来源于stack exchange,提问作者Richi Roth
相关产品推荐
相关产品推荐

