Дегідратація - етап, на якому форма збирає дані полів у масив для збереження (getState()). На ньому можна перетворювати значення й виключати поля.
Перетворити значення поля:
use Filament\Forms\Components\TextInput;
use Illuminate\Support\Facades\Hash;
TextInput::make('password')
->password()
->dehydrateStateUsing(fn (string $state): string => Hash::make($state))
->saved(fn (?string $state): bool => filled($state)) // порожнє - не чіпати пароль
->required(fn (string $operation): bool => $operation === 'create');
(Якщо в моделі є каст 'password' => 'hashed', хешувати вручну не треба.)
Виключити поле зі збереження:
TextInput::make('password_confirmation')
->password()
->same('password')
->saved(false);
Поле валідується, але в масив даних не потрапляє.
Що не зберігається за замовчуванням:
- вимкнені поля (
disabled()) - щоб користувач не міг підмінити значення через Livewire. Явнийsaved()повертає збереження, але тоді значення знову контролює клієнт; - приховані поля (
hidden()).
Додати чи змінити дані на рівні сторінки ресурсу:
// CreatePost
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
// EditPost
protected function mutateFormDataBeforeSave(array $data): array
{
$data['last_edited_by_id'] = auth()->id();
return $data;
}
protected function mutateFormDataBeforeFill(array $data): array
{
// підготувати дані запису перед заповненням форми
return $data;
}
Для модальних дій (CreateAction, EditAction) те саме робить mutateDataUsing().
Що де робити:
- перетворення одного поля - у самому полі (
dehydrateStateUsing()), щоб правило жило поруч з полем; - дані, яких немає у формі (автор, тенант, хто редагував), - у
mutateFormDataBeforeCreate/Save(). Ніколи не через приховане поле: його значення приходить з браузера; - повністю власне збереження -
handleRecordCreation()/handleRecordUpdate()на сторінці.