我的想法已经不多了。我有一个控制器方法来更新我的数据库中的用户记录。
有一个表单,当前用户可以在其中输入他的姓名,用户名,电子邮件和密码。除密码之外的所有字段都预先填充了存储的值。
当用户将密码字段留空时,将覆盖当前密码。当然,我尝试使用empty()
和isset()
。
这是我的控制器方法:
public function update($user_id, Request $request){
if(Auth::user()->canUpdateUser($user_id)){
$user = User::find($user_id);
$inputs = $request->all();
foreach($inputs as $key => $value){
if($key === 'password' && !empty($inputs[$key])) {
$validator = Validator::make($inputs, [
'password' => 'confirmed|required'
]);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
} else {
$user->$key = bcrypt($value);
}
} elseif($key === 'password_confirmation' || $key === '_token'){
// Nothing
} elseif($key === 'username') {
$validator = Validator::make($request->all(), [
'username' => 'unique:users,username,' . $user->id
]);
if($validator->fails()){
return back()->withErrors($validator)->withInput();
} else {
$user->$key = $value;
}
} elseif($key === 'email'){
$validator = Validator::make($request->all(), [
'email' => 'unique:users,email,' . $user->id
]);
if($validator->fails()){
return back()->withErrors($validator)->withInput();
} else {
$user->$key = $value;
}
} else {
echo $key, "<br>";
$user->$key = $value;
}
}
$user->save();
//return back()->with('success', 'Deine Daten wurden geändert');
} else {
abort(401);
}
}
答案 0 :(得分:0)
为什么for循环遍历每个变量?即使您有2个字段错误,您的方式一次只会返回一个错误。只需正常验证和更新用户(没有密码字段),然后对密码部分进行条件检查:
public function update($user_id, Request $request){
if(Auth::user()->canUpdateUser($user_id)){
$user = User::find($user_id);
$fields = $request->except('password');
$validator = Validator::make($fields, [
'email' => 'unique:users,email,' . $user->id,
'username' => 'unique:users,username,' . $user->id
]);
if($validator->fails()){
return back()->withErrors($validator)->withInput();
} else {
$user->update($fields);
}
}
$pw = $request->get('password', '');
if(str_len($pw) && $pw == $request->get('password_confirmation')){
$user->pw = bcrypt($pw);
}
$user->save();
return back()->with('success', 'Deine Daten wurden geändert');
} else {
abort(401);
}