CreateAction і EditAction відкривають модальне вікно з формою і зберігають запис. Кожен етап можна змінити.
Дані перед збереженням:
use Filament\Actions\CreateAction;
CreateAction::make()
->mutateDataUsing(function (array $data): array {
$data['user_id'] = auth()->id();
return $data;
})
Для EditAction є ще mutateRecordDataUsing() - змінити дані запису перед заповненням форми.
Власний процес збереження:
use Illuminate\Database\Eloquent\Model;
CreateAction::make()
->using(function (array $data, string $model): Model {
return app(CreateOrder::class)->handle($data); // доменна дія замість $model::create()
})
Хуки життєвого циклу:
CreateAction::make()
->beforeFormFilled(fn () => ...)
->afterFormValidated(fn () => ...)
->before(fn () => ...) // перед збереженням
->after(fn (Model $record) => ...) // після збереження
Зупинити процес:
use Filament\Notifications\Notification;
EditAction::make()
->before(function (EditAction $action, Order $record) {
if ($record->isShipped()) {
Notification::make()
->warning()
->title('Відправлене замовлення змінювати не можна')
->send();
$action->halt();
}
})
halt() проти cancel():
halt()- зупинити збереження, але лишити модальне вікно відкритим з введеними даними. Користувач може виправити й спробувати ще раз;cancel()- зупинити дію повністю й закрити вікно.
Що варто знати:
- сповіщення про успіх змінюють через
successNotificationTitle()чиsuccessNotification(), а редирект - черезsuccessRedirectUrl(); after()виконується після збереження, але в тому ж запиті. Довгі операції (листи, інтеграції) варто ставити в чергу, інакше вікно «зависне»;- сторінки ресурсу мають свої аналоги:
mutateFormDataBeforeCreate(),beforeCreate(),afterCreate(),handleRecordCreation()на класі сторінки; CreateActionмає «Створити ще один» - для моделей, де це не має сенсу, вимикаєтьсяcreateAnother(false).