applyDashboardDomain(); } /** * Keep Laravel's URL generation in sync with the dashboard-set panel domain * WITHOUT ever touching .env. * * The panel domain lives in the DATABASE (Settings: `dashboard_domain`), not in * .env — and the app never rewrites .env. So at runtime, if a domain is set, we * override config('app.url') to `https://` so that signed URLs, absolute * links, password-reset mails, etc. resolve against the operator-configured host. * * Guarded hard: during `artisan migrate`, fresh installs, or any moment before the * `settings` table exists (or the DB is unreachable), this must be a silent no-op so * console commands and migrations never crash. Hence the Schema::hasTable() probe * plus a defensive try/catch around the DB read. */ private function applyDashboardDomain(): void { try { if (! Schema::hasTable('settings')) { return; } $domain = Setting::get('dashboard_domain'); if ($domain === null || $domain === '') { return; } config(['app.url' => 'https://'.$domain]); } catch (Throwable) { // No DB / table yet (install, migrate, CI). Leave config('app.url') as-is — // never fail boot over a settings lookup. } } }