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());}