Prevent Destructive Commands From Running in Laravel
Last updated on by Paul Redmond
As of Laravel 11.9 you can now prevent commands like database migrations from accidentally running in production environments with a Prohibitable
trait:
use Illuminate\Console\Command;use Illuminate\Console\Prohibitable; class SomeDestructiveCommand extends Command{ use Prohibitable;} // SomeDestructiveCommand::prohibit($this->app->isProduction());
The Laravel framework includes some database commands that include the Prohibitable
trait, such as db:wipe
, migrate:fresh
, migrate:refresh
, and migrate:reset
:
public function boot(): void{ FreshCommand::prohibit(); RefreshCommand::prohibit(); ResetCommand::prohibit(); WipeCommand::prohibit();}
Using the DB
Facade, you can prohibit destructive database commands built into Laravel:
// Prohibits: db:wipe, migrate:fresh, migrate:refresh, and migrate:resetDB::prohibitDestructiveCommands($this->app->isProduction());
The prohibit()
method accepts a Boolean
argument that defaults to true
, and you can conditionally prevent commands from running using whatever logic you need, so that you can still run them in development environments:
public function boot(): void{ YourCommand::prohibit($this->app->isProduction());}