Laravel предоставляет мощную систему валидации, но иногда встроенных правил недостаточно для специфических требований вашего приложения. В таких случаях вы можете создавать собственные правила валидации. В этой статье мы рассмотрим несколько способов создания кастомных правил в Laravel.
1. Использование замыканий (Closures)
Самый простой способ добавить кастомное правило — использовать замыкание:
$validator = Validator::make($request->all(), [
'title' => [
'required',
function ($attribute, $value, $fail) {
if ($value === 'foo') {
$fail('Поле '.$attribute.' не может быть "foo".');
}
},
],
]);
2. Создание классов правил
Для более сложных правил лучше создать отдельный класс. Laravel предоставляет команду для генерации класса правила:
php artisan make:rule Uppercase
Сгенерированный класс будет выглядеть так:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements Rule
{
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
public function message()
{
return 'Поле :attribute должно быть в верхнем регистре.';
}
}
Использование:
use App\Rules\Uppercase;
$validator = Validator::make($request->all(), [
'name' => ['required', new Uppercase],
]);
3. Правила с параметрами
Вы можете создавать правила, которые принимают параметры:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class MaxWords implements Rule
{
protected $maxWords;
public function __construct($maxWords)
{
$this->maxWords = $maxWords;
}
public function passes($attribute, $value)
{
return count(explode(' ', trim($value))) <= $this->maxWords;
}
public function message()
{
return "Поле :attribute не должно содержать более {$this->maxWords} слов.";
}
}
Использование:
use App\Rules\MaxWords;
$validator = Validator::make($request->all(), [
'description' => ['required', new MaxWords(100)],
]);
4. Использование Rule::when для условной валидации
Laravel предоставляет удобный метод when
для условного применения правил:
use Illuminate\Validation\Rule;
$validator = Validator::make($request->all(), [
'role_id' => Rule::when($request->user()->is_admin, 'required|exists:roles,id'),
]);
5. Имплементация интерфейса ValidationRule (Laravel 9+)
В Laravel 9+ появился более простой интерфейс для создания правил:
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class EvenNumber implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if ($value % 2 !== 0) {
$fail("Поле :attribute должно быть четным числом.");
}
}
}
6. Регистрация кастомных правил в сервис-провайдере
Если вы часто используете кастомное правило, можно зарегистрировать его в сервис-провайдере:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('phone_number', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^\+?[0-9]{10,15}$/', $value);
});
Validator::replacer('phone_number', function ($message, $attribute, $rule, $parameters) {
return str_replace(':attribute', $attribute, 'Неверный формат телефона.');
});
}
}
Использование:
$validator = Validator::make($request->all(), [
'phone' => 'required|phone_number',
]);
Заключение
Создание кастомных правил валидации в Laravel — мощный инструмент для обеспечения целостности данных в вашем приложении. Выбирайте подход в зависимости от сложности вашего правила:
- Для простых условий используйте замыкания
- Для сложной логики создавайте классы правил
- Для часто используемых правил регистрируйте их в сервис-провайдере
Кастомные правила делают вашу валидацию более выразительной и поддерживаемой, а также позволяют централизовать сложную логику проверки данных.
Добавить комментарий