gpt4 book ai didi

拉维尔 5.8 : Validation multiple inputs

转载 作者:行者123 更新时间:2023-12-03 22:47:34 24 4
gpt4 key购买 nike

我有什么

我有一个包含 3 个输入的表单,我想检查以下条件:

  • 所有输入都是整数,并且它们是必需的。
  • 我们对所有数字进行数学运算,然后判断运算是否成功。
    • 成功:我们将用户重定向到成功页面。
    • 不成功:我们向用户显示一条错误消息,并向他解释这些数字无效。

我用以下几行解决了这个问题。

Controller :

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 时:
    • 突出显示 number1number2number3 输入。
    • 显示独特的自定义错误消息
    • 隐藏number1number2number3输入错误信息。

我如何使用验证器做到这一点?

解决方案

创建一个 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,并且该字段不会被突出显示。

像这样设置 Controller :

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

最佳答案

我还没有对此进行测试,但我认为它可以让您朝着正确的方向前进。

1//高亮输入

您可以通过访问 View 中的错误对象来执行此操作。该对象是 MessageBag 对象的一个​​实例。

这是文档:https://laravel.com/docs/5.7/validation#working-with-error-messages

例子:

// 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">

2 & 3//显示独特的自定义错误消息并隐藏默认消息

查看验证器文档:https://laravel.com/docs/5.8/validation#custom-error-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');
}
});
}

关于拉维尔 5.8 : Validation multiple inputs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55122403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com