强制删除操作
简介
Filament 包含一个用于强制删除已 软删除 的 Eloquent 记录的操作。点击触发按钮后,会弹出模态框要求用户确认。你可以这样使用:
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()

或者,若要将其添加为表格批量操作,以便用户选择要强制删除的行,请使用 Filament\Actions\ForceDeleteBulkAction:
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->toolbarActions([
ForceDeleteBulkAction::make(),
]);
}强制删除后重定向
你可以使用 successRedirectUrl() 方法在表单提交后设置自定义重定向:
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()
->successRedirectUrl(route('posts.list'))TIP
除了 $record 之外,successRedirectUrl() 函数还可以注入各种实用工具作为参数。
自定义强制删除通知
记录成功强制删除后,会向用户发送通知,提示操作成功。
若要自定义该通知的标题,请使用 successNotificationTitle() 方法:
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()
->successNotificationTitle('User force-deleted')TIP
除了允许静态值外,successNotificationTitle() 方法也接受一个函数来动态计算值。你可以将各种实用工具作为参数注入该函数。
你可以使用 successNotification() 方法自定义整个通知:
use Filament\Actions\ForceDeleteAction;
use Filament\Notifications\Notification;
ForceDeleteAction::make()
->successNotification(
Notification::make()
->success()
->title('User force-deleted')
->body('The user has been force-deleted successfully.'),
)TIP
除了允许静态值外,successNotification() 方法也接受一个函数来动态计算值。你可以将各种实用工具作为参数注入该函数。
若要完全禁用通知,请使用 successNotification(null) 方法:
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()
->successNotification(null)生命周期钩子
你可以使用 before() 和 after() 方法在记录强制删除前后执行代码:
use Filament\Actions\ForceDeleteAction;
ForceDeleteAction::make()
->before(function () {
// ...
})
->after(function () {
// ...
})TIP
这些钩子函数可以注入各种实用工具作为参数。
提升强制删除批量操作的性能
默认情况下,ForceDeleteBulkAction 会先将所有 Eloquent 记录加载到内存中,再逐条循环删除。
若要删除大量记录,可使用 chunkSelectedRecords() 方法每次获取较少数量的记录,从而降低应用的内存占用:
use Filament\Actions\ForceDeleteBulkAction;
ForceDeleteBulkAction::make()
->chunkSelectedRecords(250)Filament 在删除前将 Eloquent 记录加载到内存,有两个原因:
- 允许在删除前使用模型策略对集合中的单条记录进行授权(例如使用 `authorizeIndividualRecords('forceDelete')`)。
- 确保删除记录时会触发模型事件,例如模型观察者中的 `forceDeleting` 和 `forceDeleted` 事件。
若不需要单条记录的策略授权和模型事件,可以使用 fetchSelectedRecords(false) 方法。这样在删除前不会将记录加载到内存,而是用单次查询删除:
use Filament\Actions\ForceDeleteBulkAction;
ForceDeleteBulkAction::make()
->fetchSelectedRecords(false)