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

我怎么能用验证器做到这一点?

Solution

创建一个名为Form Request ValidationNumbersForm,例如: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 验证 - 始终遵守任何规则

Laravel 5.8 有条件地插入 sql 片段

Laravel 5.8 文件上传使用 PUT 方法和 ajax

请求的身份验证范围不足。使用谷歌日历和 laravel 5.8

Laravel 5.8 验证竞争条件

在 Laravel 5.8 中以用户身份管理员登录