Что у меня есть
У меня есть форма с 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
.
Как я могу это сделать с помощью валидаторов?
Решение
Создайте Подтверждение запроса формы , называемое, например, NumbersForm
, используя:
php artisan make:request NumbersForm
Предыдущая команда создает файл App/Http/Requests/NumbersForm.php
. Make 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