Как исключить проверку поля пароля пользователя при обновлении - PullRequest
1 голос
/ 14 апреля 2020

Мне нужно иметь возможность обновлять пользователя, не вводя его пароль в форму. Я выполнил правило проверки, но получаю сообщение об ошибке: SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец «пароль» не может быть пустым. В противном случае обновление работает.

Это мой контроллер:

 public function update(Requests\UserUpdateRequest  $request, $id)
{
    User::findOrFail($id)->update($request->all())->except('password');
    return redirect('backend/users')->with("message", "User was updated");
}

Это UserUpdateRequest:

public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'name' => 'required',
        'email' => 'email|required|unique:users,email,' . $this->route('user'),
        'password' =>'sometimes|required_with:password_confirmation|confirmed'];


}

И это форма, которую я использую:

<div class="form-group {{ $errors->has('name') ? 'has-error': '' }} ">
        {!! Form::label('name') !!}
        {!! Form::text('name',  null, ['class'=>'form-control']) !!}
        @if($errors->has('name'))
            <span class="help-block">{{$errors->first('name')}}</span>
        @endif

    </div>

    <div class="form-group {{ $errors->has('email') ? 'has-error': '' }}">
        {!! Form::label('email') !!}
        {!! Form::text('email', null, ['class'=>'form-control']) !!}
        @if($errors->has('email'))
            <span class="help-block">{{$errors->first('email')}}</span>
        @endif
    </div>

    <div class="form-group {{ $errors->has('password') ? 'has-error': '' }}">
        {!! Form::label('password') !!}
        {!! Form::password('password',  ['class'=>'form-control']) !!}
        @if($errors->has('password'))
            <span class="help-block">{{$errors->first('password')}}</span>
        @endif
    </div>

    <div class="form-group {{ $errors->has('password_confirmation') ? 'has-error': '' }}">
        {!! Form::label('password_confirmation') !!}
        {!! Form::password('password_confirmation',  ['class'=>'form-control']) !!}
        @if($errors->has('password_confirmation'))
            <span class="help-block">{{$errors->first('password_confirmation')}}</span>
        @endif
    </div>

Также вот миграция для пользовательской таблицы:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

Что я делаю не так? Я на Laravel 7,5

1 Ответ

1 голос
/ 14 апреля 2020

Проблема возникает из-за того, что «пароль» всегда установлен - если входные данные оставлены пустыми, у них есть значение null.

Решением будет удаление этого нулевого значения до запуска валидатора ваш запрос формы.

Добавьте в UserUpdateRequest следующее:

/**
* Prepare the data for validation.
*
* @return void
*/

protected function prepareForValidation()
{
    if($this->password == null) {
        $this->request->remove('password');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...