验证器功能不会在编辑页面上产生错误
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());
使用您的自定义控制器方法,该方法将在您实施时创建验证器并传递规则
下面有一个使用自定义验证的 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());
使用您的自定义控制器方法,该方法将在您实施时创建验证器并传递规则