В Laravel можно создать и использовать пользовательские правила валидации с помощью механизма кастомных валидаторов. Это полезно, когда встроенных правил валидации недостаточно для ваших нужд.
Шаги для создания и использования пользовательского правила валидации:
1. Создание пользовательского правила
Для создания нового правила в Laravel можно воспользоваться artisan-командой:
php artisan make:rule CustomRuleName
Это создаст файл правила в директории app/Rules.
2. Реализация правила
После создания файла правила, откройте его и настройте логику валидации. Например, правило для проверки строки на заглавную букву может выглядеть так:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class StartsWithUppercase implements Rule
{
/**
* Создать новый экземпляр правила.
*/
public function __construct()
{
//
}
/**
* Определить, проходит ли атрибут проверку.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Проверка, что первая буква заглавная
return mb_strtoupper(mb_substr($value, 0, 1)) === mb_substr($value, 0, 1);
}
/**
* Получить сообщение об ошибке валидации.
*
* @return string
*/
public function message()
{
return 'The :attribute must start with an uppercase letter.';
}
}
3. Использование правила в контроллере или форме
Чтобы применить пользовательское правило, просто укажите его в массиве правил в вашем контроллере или форме. Например:
use App\Rules\StartsWithUppercase;
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', new StartsWithUppercase()],
]);
// Дальнейшая логика сохранения данных...
}
Таким образом, когда поле title не будет начинаться с заглавной буквы, сработает ошибка валидации, и сообщение будет взято из метода message() вашего правила.
4. Локализация сообщения
Для того чтобы локализовать сообщение об ошибке, можно изменить метод message() так, чтобы он использовал файл локализации:
public function message()
{
return __('validation.custom.uppercase');
}
А затем в resources/lang/ru/validation.php добавить ключ для локализации:
'custom' => [
'uppercase' => 'Заголовок должен начинаться с заглавной буквы.',
],
5. Валидация без создания классов (быстрый способ)
Если нужно быстро создать кастомную валидацию без создания отдельного класса, можно использовать замыкания в методе validate():
$request->validate([
'title' => ['required', function ($attribute, $value, $fail) {
if (mb_strtoupper(mb_substr($value, 0, 1)) !== mb_substr($value, 0, 1)) {
$fail('The ' . $attribute . ' must start with an uppercase letter.');
}
}],
]);