【问题标题】:Laravel 5.8: Validation multiple inputsLaravel 5.8:验证多个输入
【发布时间】: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 时:
    • 突出显示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-&gt;errors()-&gt;add('number1', ' '); 的第二个参数中的文本不重要,但不能为空。如果是空字符串,$errors-&gt;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

【问题讨论】:

标签: laravel validation laravel-5


【解决方案1】:

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

1 // 突出显示输入

您可以通过访问视图中的错误对象来做到这一点。该对象是 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');
        }
    });
}

【讨论】:

    【解决方案2】:

    自定义验证规则:

    要添加自定义消息和验证,您还可以写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.',
        ];
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 2020-12-26
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2019-02-22
      • 2018-01-20
      • 2013-05-02
      相关资源
      最近更新 更多