Метод withValidator
Метод withValidator применяется в классе FormRequest
и позволяет выполнить дополнительную валидацию после того,
как стандартные правила проверки были применены.
Метод принимает экземпляр валидатора и позволяет
добавить пользовательские проверки или модифицировать
поведение валидации.
Синтаксис
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
class CustomRequest extends FormRequest
{
public function rules()
{
return [
'field' => 'required|string'
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
// дополнительная логика
});
}
}
?>
Пример
Давайте добавим проверку, чтобы поле 'title' не содержало запрещённых слов:
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
class ArticleRequest extends FormRequest
{
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string'
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
$title = $this->input('title');
$bannedWords = ['spam', 'advertisement', 'promo'];
foreach ($bannedWords as $word) {
if (stripos($title, $word) !== false) {
$validator->errors()->add(
'title',
'The title contains banned words.'
);
break;
}
}
});
}
}
?>
Пример
Давайте проверим, что дата окончания не раньше даты начала:
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
use CarbonCarbon;
class EventRequest extends FormRequest
{
public function rules()
{
return [
'start_date' => 'required|date',
'end_date' => 'required|date'
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
$start = Carbon::parse($this->input('start_date'));
$end = Carbon::parse($this->input('end_date'));
if ($end->lt($start)) {
$validator->errors()->add(
'end_date',
'The end date must be after the start date.'
);
}
});
}
}
?>
Пример
Давайте добавим проверку, что суммарная стоимость товаров не превышает лимит:
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
class OrderRequest extends FormRequest
{
public function rules()
{
return [
'items' => 'required|array|min:1',
'items.*.price' => 'required|numeric|min:0',
'items.*.quantity' => 'required|integer|min:1'
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
$total = 0;
$items = $this->input('items', []);
foreach ($items as $item) {
$total += $item['price'] * $item['quantity'];
}
if ($total > 10000) {
$validator->errors()->add(
'items',
'Total order amount cannot exceed 10000.'
);
}
});
}
}
?>
Пример
Давайте добавим условную проверку, если поле 'type' равно 'premium':
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
class ProductRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'required|string|max:100',
'type' => 'required|in:standard,premium',
'price' => 'required|numeric|min:0'
];
}
public function withValidator(Validator $validator)
{
$validator->after(function ($validator) {
if ($this->input('type') === 'premium') {
$price = $this->input('price');
if ($price < 100) {
$validator->errors()->add(
'price',
'Premium product price must be at least 100.'
);
}
}
});
}
}
?>