Delete Guard plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Delete Guard

Community

Prevent unsafe deletions in Filament by enforcing deletion rules at the model level and showing a friendly Filament notification when deletion is blocked.

Tags: Action
Supported versions:
5.x
Jose Antonio Rojas avatar Author: Jose Antonio Rojas

Package health

Beta

Automated checks of this plugin's Composer package

88 / 100
Security 85
Maintenance 88
Ecosystem 100
15 checks
  • Skipped: GitHub Actions pinned to SHA
  • Skipped: GitLab CI includes pinned to SHA
  • Passed: Open security advisories
  • Passed: Dependabot PR responsiveness — No open Dependabot PRs.
  • Skipped: Renovate MR responsiveness
  • Skipped: Dependabot or Renovate configured
  • Skipped: Dependency update cooldown configured
  • Failed: Provides a security policy View details on Plumb
  • Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
  • Warning: Commit and release recency — Low activity: last commit 177 days ago; last release 181 days ago.
  • Passed: composer.lock not committed by library composer.lock is absent from the released dist archive.
  • Passed: Dist archive is lean
  • Passed: Current Laravel version supported — Package dependencies resolve together with current Laravel 13.0.
  • Passed: Current PHP version supported — Constraint ^8.2 supports current PHP 8.5.
  • Skipped: Current Symfony version supported
Third-party plugin. This is built by the community, not the Filament team. Filament does not review, endorse, or vet the security of plugins outside the filament/ namespace. Review the source and install at your own risk. Found malware or an unresolved security issue the author won't address? Report it .
Powered by Plumb Last scanned 1 week ago

Documentation

Packagist Version Packagist Downloads License

Prevent unsafe deletions in Filament by enforcing deletion rules at the model level and showing friendly notifications when deletion is blocked.


#What does it do?

This package provides:

  • A small contract (HasPreventDeletion) to describe deletion rules.
  • A trait (InteractsWithPreventDeletion) with the core logic to validate relations and custom rules.
  • A CannotDeleteModelException to block deletion.
  • Filament integration that customizes DeleteAction to:
    • disable the action (optional),
    • show a tooltip (optional),
    • attempt $record->delete() and, if blocked, show a Filament notification.

#Installation

composer require joserojasrodriguez/filament-delete-guard

The package automatically registers its service provider (Laravel package discovery).


#Usage

#1) Implement the contract and use the trait

In your Eloquent model:

use Illuminate\Database\Eloquent\Model;
use Joserojasrodriguez\FilamentDeleteGuard\Contracts\HasPreventDeletion;
use Joserojasrodriguez\FilamentDeleteGuard\Traits\InteractsWithPreventDeletion;

class Invoice extends Model implements HasPreventDeletion
{
    use InteractsWithPreventDeletion;

    public function deletionRelations(): array
    {
        return [
            // relation method => human label (used in the default message)
            'payments' => 'payments',
            'lines' => 'lines',
        ];
    }

    public function deletionMessages(): array
    {
        return [
            // optional per-relation override
            'payments' => 'You cannot delete an invoice with associated payments.',
        ];
    }

    public function customDeletionRules(): void
    {
        // Optional: add any extra checks here.
        // To block deletion, throw CannotDeleteModelException.
        // throw CannotDeleteModelException::because('This invoice is locked.');
    }
}

Note: You do not need to manually add the deleting hook in your model. The InteractsWithPreventDeletion trait handles it automatically.


#Filament integration

Filament integration globally configures the delete action:

  • Calls $record->delete() and catches CannotDeleteModelException.
  • If the exception occurs, shows a Filament notification with:
    • title: filament-delete-guard::messages.deletion_prevented
    • body: the exception message

#BulkActions support

The package works with Filament DeleteBulkAction.

Each record deletion is executed individually, so the deleting event is triggered for every model. If a record throws CannotDeleteModelException, Filament counts it as a failed deletion and continues processing the remaining records.

Partial success notifications are automatically handled by Filament.

#Optional: Disable the delete action and show tooltip

If your model implements these methods, the delete action can be disabled and display a tooltip:

public function showDeleteAction(): bool
{
    return false; // disables the delete action
}

public function showDeleteActionMessage(): ?string
{
    return 'Cannot delete because it is reconciled.'; // tooltip text
}

These methods are checked at runtime by the Filament action configuration.


#How it works internally

The trait registers a model deleting event using Laravel’s trait booting convention:

protected static function bootInteractsWithPreventDeletion(): void
{
    static::deleting(fn ($model) => $model->ensureCanBeDeleted());
}

#Translations

The package ships translations for:

  • filament-delete-guard::messages.deletion_prevented
  • filament-delete-guard::messages.has_relation

Default messages (en):

  • Deletion blocked
  • Cannot delete because it has :relation associated.

#License

MIT

The author

Jose Antonio Rojas avatar Author: Jose Antonio Rojas

Prevent unsafe deletions in Filament by enforcing deletion rules at the model level and showing a friendly Filament notification when deletion is blocked.

Plugins
1
Stars
5