From 41beedb96445e1234f266185254f13da63e88663 Mon Sep 17 00:00:00 2001 From: julien Date: Mon, 9 Mar 2026 02:33:58 +0100 Subject: [PATCH] Various improvements --- .env.example | 2 + .gitignore | 11 ++++- composer.json | 5 ++- public/index.php | 57 +++++++++++++++++------- src/Repositories/PostRepositoryMedoo.php | 2 - src/Routes/web.php | 6 +-- 6 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..88db34a --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +APP_ENV=development +# APP_ENV=production diff --git a/.gitignore b/.gitignore index 80180ec..a53eda4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# Environnement local +.env + +# Composer +/vendor/ composer.lock -database/ -vendor/ + +# Base de données SQLite +/database/*.sqlite +/database/*.db diff --git a/composer.json b/composer.json index 1bb45c4..554cdd2 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ "slim/psr7": "*", "twig/twig": "*", "slim/twig-view": "^3.4", - "catfan/medoo": "2.*" + "catfan/medoo": "2.*", + "vlucas/phpdotenv": "^5.6" }, "autoload": { "psr-4": { @@ -25,4 +26,4 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.94" } -} \ No newline at end of file +} diff --git a/public/index.php b/public/index.php index 8e5c882..5a80616 100644 --- a/public/index.php +++ b/public/index.php @@ -9,6 +9,26 @@ use Slim\Views\Twig; use Slim\Views\TwigMiddleware; use Twig\Loader\FilesystemLoader; use Medoo\Medoo; +use Dotenv\Dotenv; + +// Charger .env +$dotenv = Dotenv::createImmutable(__DIR__ . '/../'); +$dotenv->safeLoad(); // safeLoad pour tolérer l'absence du fichier en dev + +// Environnement +$appEnv = strtolower($_ENV['APP_ENV'] ?? $_SERVER['APP_ENV'] ?? 'production'); +$isDebug = ($appEnv === 'development' || $appEnv === 'dev'); + +// Configuration PHP display errors 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); +} // ------------------------- // DB SQLite + fichier @@ -27,7 +47,7 @@ $dbFile = __DIR__ . '/../database/app.sqlite'; ensureDatabaseFile($dbFile); // ------------------------- -// Instancier Medoo (SQLite) — compatibilité options +// Instancier Medoo (SQLite) // ------------------------- $medooOptions = [ 'database_type' => 'sqlite', @@ -35,14 +55,9 @@ $medooOptions = [ 'error' => PDO::ERRMODE_EXCEPTION, 'charset' => 'utf8', ]; - -// Certaines variantes/versions de Medoo (selon l'installation/composer.lock) -// peuvent émettre un warning en cherchant 'database_name'. -// Dupliquer la valeur pour éviter le warning sans changer le comportement. if (!isset($medooOptions['database_name'])) { $medooOptions['database_name'] = $medooOptions['database_file']; } - $database = new Medoo($medooOptions); // Créer la table si nécessaire (schéma minimal) @@ -57,25 +72,33 @@ SQL ); // ------------------------- -// Services +// Services (instantiation simple et explicite) // ------------------------- -$services = []; -$services['twig'] = new Twig(new FilesystemLoader(__DIR__ . '/../views'), ['cache' => false]); -$services['db'] = $database; -$services['post_repository'] = new App\Repositories\PostRepositoryMedoo($database); +$twig = new Twig(new FilesystemLoader(__DIR__ . '/../views'), ['cache' => false]); +$postRepository = new App\Repositories\PostRepositoryMedoo($database); // ------------------------- // Slim app // ------------------------- $app = AppFactory::create(); -$app->addErrorMiddleware(true, true, true); -// Body parsing middleware nécessaire pour que getParsedBody() fonctionne +// Configurer Error Middleware selon l'environnement +$errorMiddleware = $app->addErrorMiddleware($isDebug, $isDebug, $isDebug); + +// Optionnel : personnaliser le rendu d'erreur en production pour éviter fuite d'info +if (!$isDebug) { + $errorHandler = $errorMiddleware->getDefaultErrorHandler(); + $errorHandler->registerErrorRenderer('text/html', function () { + // message générique sans trace + return 'Erreur

Erreur serveur

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

'; + }); +} + +// Middlewares essentiels $app->addBodyParsingMiddleware(); +$app->add(TwigMiddleware::create($app, $twig)); -$app->add(TwigMiddleware::create($app, $services['twig'])); - -// Charger routes et injecter services -(require __DIR__ . '/../src/Routes/web.php')($app, $services); +// Charger routes (web.php reçoit explicitement $twig et $postRepository) +(require __DIR__ . '/../src/Routes/web.php')($app, $twig, $postRepository); $app->run(); diff --git a/src/Repositories/PostRepositoryMedoo.php b/src/Repositories/PostRepositoryMedoo.php index 7055e6e..28f4398 100644 --- a/src/Repositories/PostRepositoryMedoo.php +++ b/src/Repositories/PostRepositoryMedoo.php @@ -35,12 +35,10 @@ class PostRepositoryMedoo { $row = $this->db->get('post', ['id', 'title', 'content'], ['id' => $id]); - // Medoo peut retourner false ou empty si rien trouvé — normaliser en null. if (empty($row) || $row === false) { return null; } - // Forcer types et clés attendues return [ 'id' => (int)($row['id'] ?? 0), 'title' => (string)($row['title'] ?? ''), diff --git a/src/Routes/web.php b/src/Routes/web.php index 0f45864..60c065b 100644 --- a/src/Routes/web.php +++ b/src/Routes/web.php @@ -3,11 +3,11 @@ declare(strict_types=1); use Slim\App; +use Slim\Views\Twig; +use App\Repositories\PostRepositoryMedoo; use App\Controllers\PostController; -return function (App $app, array $services): void { - $twig = $services['twig']; - $repo = $services['post_repository']; +return function (App $app, Twig $twig, PostRepositoryMedoo $repo): void { $controller = new PostController($twig, $repo); $app->get('/', [$controller, 'index']);