Laravel 5.8:验证多个输入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.8:验证多个输入相关的知识,希望对你有一定的参考价值。
What I have
我有一个包含3个输入的表单,我想检查以下条件:
- 所有输入都是整数,它们是必需的。
- 我们用所有数字进行数学运算,如果操作成功或不成功,我们得到。 成功:我们将用户重定向到成功页面。 没有成功:我们向用户显示错误消息,并显示一条消息,说明这些号码无效。
我用以下几行解决了这个问题。
控制器:
function formAction(Request $request) {
$this->validate($request, [
'number1' => 'integer|required',
'number2' => 'integer|required',
'number3' => 'integer|required',
]);
$numbers = $request->all();
$isValid = MyOwnClass::checkMathOperation($numbers);
if($isValid) {
return redirect()->route('success');
} else {
$request->session()->flash('error', 'The numbers are not valid.');
return back();
}
}
查看(使用Bootstrap):
<form method="POST" action="{{ route('form-action') }}">
@csrf
<div class="form-group">
<label for="number1">number1</label>
<input id="number1" name="number1" class="form-control {{ $errors->has('number1') ? ' is-invalid' : '' }}" />
</div>
<div class="form-group">
<label for="number2">number2</label>
<input id="number2" name="number2" class="form-control {{ $errors->has('number2') ? ' is-invalid' : '' }}" />
</div>
<div class="form-group">
<label for="number3">number3</label>
<input id="number3" name="number3" class="form-control {{ $errors->has('number3') ? ' is-invalid' : '' }}" />
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
What I looking for
- 当
MyOwnClass::checkMathOperation($numbers)
是false
时: 突出number1
,number2
和number3
输入。 显示唯一的自定义错误消息 隐藏number1
,number2
和number3
输入错误消息。
我怎么能用验证器做到这一点?
Solution
创建一个名为Form Request Validation的NumbersForm
,例如:php artisan make:request NumbersForm
:
App/Http/Requests/NumbersForm.php
上一个命令创建一个authorize()
文件。让true
返回rules()
,将验证规则放入withValidatior()
并创建一个class NumbersForm extends FormRequest
{
public function authorize() {
return true;
}
public function rules() {
return [
'number1' => 'integer|required',
'number2' => 'integer|required',
'number3' => 'integer|required',
];
}
public function withValidator($validator) {
$validator->after(function ($validator) {
$numbers = $this->except('_token'); // Get all inputs except '_token'
$isValid = MyOwnClass::checkMathOperation($numbers);
if(!$isValid) {
$validator->errors()->add('number1', ' ');
$validator->errors()->add('number2', ' ');
$validator->errors()->add('number3', ' ');
$validator->errors()->add('globalError', 'The numbers are not valid.');
}
});
}
}
函数。
$validator->errors()->add('number1', ' ');
注意:$errors->has('number1')
的第二个参数中的文本并不重要,但它不能为空。如果它是一个空字符串,false
将返回use App\Http\Requests\NumbersForm;
function formAction(NumbersForm $request) {
$this->validated();
return redirect()->route('success');
}
,并且该字段将不会被高亮显示。
像这样设置控制器:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
最后,如果我们要打印一个唯一的错误消息,我们必须从视图中删除以下行:
@if ($errors->has('globalError'))
<div class="alert alert-danger">
{{ $errors->first('globalError') }}
</div>
@else
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@endif
并替换为:
https://laravel.com/docs/5.7/validation#working-with-error-messages
我没有对此进行测试,但我认为它可以让你朝着正确的方向前进。
1 // Highlight the inputs
您可以通过访问视图中的错误对象来完成此操作。此对象是MessageBag对象的实例。
这是文档:// if the error exists for the input the class will be added
<input class=" {{ $error->has('number1') ? 'highlight' : '' }}" name="number1">
<input class=" {{ $error->has('number2') ? 'highlight' : '' }}" name="number2">
<input class=" {{ $error->has('number3') ? 'highlight' : '' }}" name="number3">
例:
https://laravel.com/docs/5.8/validation#custom-error-messages
2 & 3 // Show a unique custom error message and hide the default messages
请参阅验证器文档:https://laravel.com/docs/5.7/validation#working-with-error-messages && function formAction(Request $request) {
$validator = $this->validate($request, [
'number1' => 'integer|required',
'number2' => 'integer|required',
'number3' => 'integer|required',
]);
$validator->after(function ($validator) {
$numbers = $request->all();
$isValid = MyOwnClass::checkMathOperation($numbers);
if(!$isValid) {
$validator->errors()->add('number1', 'Unique message');
$validator->errors()->add('number2', 'Unique message');
$validator->errors()->add('number3', 'Unique message');
}
});
}
- 这应该解决这两个问题。
有一个验证器回调,我认为你可以将第二次验证传递给它。如果这些数字无效,那么您可以添加自定义错误消息并以与上面相同的方式访问它们。
a custom validation rule
自定义验证规则:
要添加自定义消息和验证,您还可以编写class Uppercase implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be uppercase.';
}
}
例:
public function messages()
{
return [
'number1.required' => 'My custom message telling the user he needs to fill in the number1 field.',
'number1.integer' => 'My custom message telling the user he needs to use an integer.',
];
}
自定义错误消息:
您还可以在请求中为规则添加自定义错误消息:
qazxswpoi
以上是关于Laravel 5.8:验证多个输入的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.8 文件上传使用 PUT 方法和 ajax