Laravel 5 - Обновление пользователя удаляет поле пароля в БД

laravel-5 laravel-5.2

31 просмотра

1 ответ

У меня заканчиваются идеи. У меня есть метод контроллера, который обновляет запись пользователя в моей базе данных.

Существует форма, в которой текущий пользователь может ввести свое имя и фамилию, имя пользователя, адрес электронной почты и пароль. Все поля, кроме пароля, заполняются сохраненными значениями.

Когда пользователь оставляет поле пароля пустым, текущий пароль будет перезаписан. Конечно, я пробовал что-то с 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);
    }
}
Автор: Brotzka Источник Размещён: 08.11.2019 10:54

Ответы (1)


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);
    }
Автор: Jeff Размещён: 20.08.2016 05:41
Вопросы из категории :
32x32