safeLoad(); // Configuration centralisée (valeurs raisonnables par défaut) $config = [ 'env' => strtolower($_ENV['APP_ENV'] ?? $_SERVER['APP_ENV'] ?? 'production'), 'twig' => [ 'cache' => false, // => mettre un chemin en production, ex: __DIR__ . '/../var/cache/twig' ], 'db' => [ 'file' => __DIR__ . '/../database/app.sqlite', 'file_mode' => 0664, ], ]; $isDebug = ($config['env'] === 'development' || $config['env'] === 'dev'); // Affichage des erreurs selon l'environnement if ($isDebug) { ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); } else { ini_set('display_errors', '0'); ini_set('display_startup_errors', '0'); error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT); } // ------------------------- // Base de données (SQLite) // ------------------------- $dbFile = $config['db']['file']; if (!file_exists($dbFile)) { if (!is_dir(dirname($dbFile))) { mkdir(dirname($dbFile), 0755, true); } touch($dbFile); chmod($dbFile, $config['db']['file_mode']); } // Options Medoo (SQLite) $medooOptions = [ 'database_type' => 'sqlite', 'database_file' => $dbFile, 'database_name' => $dbFile, // nécessaire pour certaines versions de Medoo 'charset' => 'utf8', ]; // Instancier Medoo $database = new Medoo($medooOptions); // Créer la table si nécessaire (schéma minimal) $database->query( <<<'SQL' CREATE TABLE IF NOT EXISTS post ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL ); SQL ); // ------------------------- // Services (container simple) // ------------------------- /** @var array{view: Twig, postRepository: \App\Repositories\PostRepositoryMedoo} $container */ $container = []; /** * Construire les services et les retourner dans le container. * * Reste modulaire : la fonction reste locale et conserve la variable $container = []. * * @param array $config * @param Medoo $database * @return array */ $container = (function (array $config, Medoo $database): array { $services = []; // Vue Twig $services['view'] = new Twig(new FilesystemLoader(__DIR__ . '/../views'), ['cache' => $config['twig']['cache']]); // Repository Post (Medoo) $services['postRepository'] = new App\Repositories\PostRepositoryMedoo($database); return $services; })($config, $database); // ------------------------- // Slim app // ------------------------- $app = AppFactory::create(); // Error middleware $errorMiddleware = $app->addErrorMiddleware($isDebug, $isDebug, $isDebug); if (!$isDebug) { $errorHandler = $errorMiddleware->getDefaultErrorHandler(); // Renderer générique en production $errorHandler->registerErrorRenderer('text/html', function (Throwable $exception, bool $displayErrorDetails) { return 'Erreur

Erreur serveur

Une erreur est survenue. Veuillez réessayer plus tard.

'; }); } // Middlewares essentiels $app->addBodyParsingMiddleware(); $app->add(TwigMiddleware::create($app, $container['view'])); // Charger routes (web.php reçoit le container) (require __DIR__ . '/../src/Routes/web.php')($app, $container); // Lancer l'app $app->run();