Версия 1.5.1 — 2026-06-03
Хотфикс для деплоя на свежую БД: миграции падали из-за порядка запуска.
Исправлено
Миграции на свежей БД падали с «relation "audits" does not exist»
При первом разворачивании на чистую базу Laravel запускает миграции в порядке timestamp'а файла. Миграция 2026_04_10_120000_grant_super_admin_permissions_and_assign_to_sidorenko идёт раньше, чем 2026_05_07_165231_create_audits_table.
Первая раздаёт супер-админу все права через Spatie syncPermissions(), что стреляет событие PermissionAttached. Наш App\Providers\AuditEventServiceProvider это событие слушает и пытается записать в таблицу audits через ActionLogger::record() → Audit::create(...). На свежей БД таблица ещё не создана (она появится только следующей майской миграцией) → SQLSTATE[42P01]: relation "audits" does not exist → миграция падает, деплой не проходит.
На существующем dev/prod это не воспроизводилось, потому что миграции применялись постепенно и таблица audits была создана раньше, чем раздавались новые права.
Фикс — в App\Services\ActionLogger: перед Audit::create(...) проверяется, существует ли таблица audits. Если нет — запись тихо скипается. Результат проверки кешируется в статическом свойстве на жизнь процесса, чтобы не делать лишний запрос на каждое событие.
private static ?bool $auditsTableExists = null;
private function record(...): void {
if (! $this->auditsTableExists()) {
return;
}
Audit::create([...]);
}
private function auditsTableExists(): bool {
if (self::$auditsTableExists === null) {
try { self::$auditsTableExists = Schema::hasTable('audits'); }
catch (\Throwable) { self::$auditsTableExists = false; }
}
return self::$auditsTableExists;
}
Эффект:
- На свежей БД: миграция апреля раздаёт права, audit-события стреляют,
record()тихо скипает, миграция мая создаёт таблицуaudits, дальше всё пишется как обычно. - На существующем prod/dev: первая же проверка
Schema::hasTable('audits')вернётtrue, закешируется, поведение неизменно. - При любой другой проблеме со схемой (например, временно недоступная БД при boot'е) —
Throwableловится, лог продолжает жить.
Сценарий, где из-за этого фикса будут потеряны audit-записи — только тот самый интервал «между раздачей прав в первой миграции и созданием таблицы во второй» при первом развёртывании. Это нескольких секунд интервал на чистой инсталляции, никаких полезных записей там быть не может.