【发布时间】:2019-08-02 23:31:03
【问题描述】:
我有什么
我有一个包含 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
我在寻找什么
- 当
MyOwnClass::checkMathOperation($numbers)为false时:- 突出显示
number1、number2和number3输入。 - 显示唯一自定义错误消息
- 隐藏
number1、number2和number3输入错误消息。
- 突出显示
如何使用验证器做到这一点?
解决方案
创建一个 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');
}
最后,如果我们想打印一个独特的错误消息,我们必须从 view 中删除以下行:
@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
【问题讨论】:
-
你试过“withValidator”吗? laravel.com/docs/5.8/validation我希望你能用它来解决你的问题
标签: laravel validation laravel-5