Валідацію описують методами поля - це ті самі правила Laravel, але з підказками в інтерфейсі (зірочка обов'язкового поля, maxlength в інпуті).
use Filament\Forms\Components\TextInput;
TextInput::make('email')
->email()
->required()
->maxLength(255)
->unique(),
TextInput::make('price')
->numeric()
->minValue(0)
->rules(['decimal:0,2']), // будь-яке правило Laravel
TextInput::make('slug')
->required()
->regex('/^[a-z0-9-]+$/')
->validationMessages([
'regex' => 'Лише малі латинські літери, цифри й дефіс.',
]),
Валідація запускається під час відправки форми. Помилки показуються під полями, а збереження не відбувається.
unique() у ресурсі. Форма знає свою модель і поточний запис, тож на сторінці редагування unique() автоматично ігнорує запис, що редагується: email користувача не «конфліктує» сам із собою. Якщо це не потрібно - unique(ignoreRecord: false).
Пастка з unique(): правило Laravel звертається до таблиці напряму, оминаючи Eloquent. Тому:
- м'яко видалені записи теж вважаються зайнятими;
- мультиорендність не враховується - email буде «зайнятим», якщо він є в іншого тенанта.
Для цього є scopedUnique() - перевірка через модель з усіма глобальними скоупами, включно з SoftDeletes і тенантами.
Умовна валідація:
TextInput::make('password')
->password()
->required(fn (string $operation): bool => $operation === 'create');
$operation - create, edit або view.
Що варто знати:
- правила лише на клієнті не існує: усе перевіряється на сервері, тож підробити
maxlengthу DevTools не допоможе; - поле, яке не зберігається (
saved(false)), все одно валідується; - для повідомлень українською досить локалізації Laravel (
lang/uk/validation.php) - Filament використовує ті самі переклади.