Когда дело касается продакшена, одна случайная команда может стоить вам базы данных. В Laravel есть простой способ защититься от этого без кастомных хуков и «костылей». Речь о встроенном механизме запрета опасных команд — DB::prohibitDestructiveCommands().
Этот метод добавили тихо, но он решает большую проблему: предотвращает запуск команд, которые могут разрушить данные в боевом окружении.
Почему это важно
Команды вроде:
db:wipemigrate:freshmigrate:refreshmigrate:reset
существуют ради удобства разработки. Они очищают базу, пересоздают таблицы, откатывают миграции — на локалке это нормально.
Но в продакшене запуск любой из этих команд = потеря данных. Ошибиться легко: автоматизация, ssh-доступ, CI/CD, человеческий фактор — всё это реальные угрозы.
Как включить защиту
Достаточно добавить одну строку в AppServiceProvider:
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
DB::prohibitDestructiveCommands(
$this->app->isProduction()
);
}
}
Если приложение работает в production, Laravel автоматически заблокирует выполнение опасных команд.
Что происходит при попытке запуска
Если кто-то запустит запрещённую команду, Laravel вернёт:
“This command is prohibited from running in this environment.”
Никаких скрытых действий. Прямая и понятная защита.
Чем эта функция полезна
- Минимизирует риск случайного запуска миграций с разрушительными эффектами.
- Работает из коробки и не требует кастомных Guard’ов.
- Повышает безопасность CI/CD процессов.
- Применяется точечно: только в продакшене, без ограничений локальной разработки.
По сути — маленький механизм с большим эффектом.
Итог
DB::prohibitDestructiveCommands() — это то, что стоит включить в каждом боевом Laravel-проекте. Всего одна настройка превращает хрупкий продакшн во что-то намного более защищённое от человеческих ошибок.
Хочешь — сделаю под эту статью минималистичную обложку в фирменном стиле RWSite.ru.