L'édition de fichier nécessitait que le process web ait un accès en écriture sur .env — problématique en prod (permissions, plusieurs instances). À la place : - Table `settings` (clé/valeur) + SettingsRegistry, une liste blanche explicite des réglages modifiables (mail, OnlyOffice, GLPI, nom/URL de l'app) mappés vers leur chemin de config Laravel. - Volontairement exclu : tout ce qui touche à l'infrastructure (APP_KEY, DB_*, SESSION_DRIVER, CACHE_STORE, QUEUE_CONNECTION...) — ces valeurs sont nécessaires avant même qu'une connexion BDD existe, donc une surcharge en base ne serait pas fiable et reste réservée au .env. - AppServiceProvider applique les surcharges au boot (cache 5 min, invalidé immédiatement à l'enregistrement) ; le reste du code continue de lire config() normalement, sans changement ailleurs. - Tant qu'aucun réglage n'est enregistré, le comportement reste identique au .env actuel — transition sans rupture. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
57 lines
1.4 KiB
PHP
57 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Providers;
|
|
|
|
use App\Models\Setting;
|
|
use App\Services\SettingsRegistry;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\ServiceProvider;
|
|
use Throwable;
|
|
|
|
class AppServiceProvider extends ServiceProvider
|
|
{
|
|
/**
|
|
* Register any application services.
|
|
*/
|
|
public function register(): void
|
|
{
|
|
$this->applySettingOverrides();
|
|
}
|
|
|
|
/**
|
|
* Overlay database-stored settings (see SettingsRegistry) onto config,
|
|
* so the rest of the app keeps reading config('mail.from.address') etc.
|
|
* without knowing whether the value came from .env or the settings UI.
|
|
* Silently does nothing if the settings table doesn't exist yet (e.g.
|
|
* during the very first `migrate` on a fresh install).
|
|
*/
|
|
protected function applySettingOverrides(): void
|
|
{
|
|
try {
|
|
$overrides = Cache::remember(
|
|
SettingsRegistry::CACHE_KEY,
|
|
300,
|
|
fn () => Setting::query()->whereNotNull('value')->pluck('value', 'key')->all(),
|
|
);
|
|
} catch (Throwable) {
|
|
return;
|
|
}
|
|
|
|
$map = SettingsRegistry::configMap();
|
|
|
|
foreach ($overrides as $key => $value) {
|
|
if (isset($map[$key]) && $value !== '') {
|
|
config([$map[$key] => $value]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Bootstrap any application services.
|
|
*/
|
|
public function boot(): void
|
|
{
|
|
//
|
|
}
|
|
}
|