验证器功能不会在编辑页面上产生错误

Validator function is not resulting error on edit page

下面有一个使用自定义验证的 UserController@update_personal 方法。

用户控制器

public function update_personal(Request $request, User $user)
{
    $validator = validator($request->all());
    if ($validator->fails()) {
        return back()
            ->withErrors($validator)
            ->withInput();
    }

    $userUpdate = User::where('id', $user->id)
        ->update([
            'firstname' => $request->input('firstname'),
            'lastname' => $request->input('lastname'),
            'birth_date' => $request->input('birth_date'),
            'phone' => $request->input('phone')
        ]);

    if ($userUpdate) {
        return redirect()
            ->route('users.index', ['user' => $user->id])
            ->with('success', 'Personal details updated successfully');
    }

    return back()->withInput();
}

验证器方法

protected function validator(array $data)
{
    return Validator::make($data, [
        'firstname' => ['required', 'string', 'max:50', 'alpha'],
        'lastname' => ['required', 'string', 'max:50', 'alpha'],
        'birth_date' => ['required', 'date'],
        'phone' => ['required', new PhoneNumber()],
    ]);
}

路线

// Routes for UserController
Route::get('/users/{user}/personal', 'UserController@edit_personal')->name('users.edit-personal');
Route::put('/users/{user}/personal', 'UserController@update_personal')->name('users.update-personal');

Route::get('/users/{user}/email', 'UserController@edit_email')->name('users.edit-email');
Route::put('/users/{user}/email', 'UserController@update_email')->name('users.update-email');

Route::get('/users/{user}/password', 'UserController@edit_password')->name('users.edit-password');
Route::put('/users/{user}/password', 'UserController@update_password')->name('users.update-password');
Route::resource('users', 'UserController');

我尝试在每个输入字段下方显示错误,而不是一并显示所有错误。这是我的 blade 个名字条目之一:

<div class="form-group col-md-6">
    <label for="firstname">First Name</label>
    <input id="firstname" type="text"
           class="form-control @error('firstname') is-invalid @enderror"
           name="firstname" value="{{ $user->firstname }}" required
           autocomplete="given-name" autofocus>
    @error('firstname')
    <span class="invalid-feedback" role="alert">
        <strong>{{ $message }}</strong>
    </span>
    @enderror
</div>

问题是无论我在输入字段 'firstname' 中输入什么值,数据库都会更新并显示成功页面,而不是显示错误。

例如,我将名字从 'Kate' 更改为 'Kate1234' 并且有效。但是我在 validator() 中添加了一个 'Alpha' 标签。所以它不应该让我更新并显示输入下方的错误。知道这里有什么问题吗?

这里的问题是您没有在控制器的任何地方使用 validator 方法,而是使用需要将规则作为第二个参数传递的 validator 帮助程序。这种情况下最简单的解决方案是更改:

$validator = validator($request->all());

进入

$validator = $this->validator($request->all());

使用您的自定义控制器方法,该方法将在您实施时创建验证器并传递规则