Various improvements
This commit is contained in:
2
.env.example
Normal file
2
.env.example
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
APP_ENV=development
|
||||||
|
# APP_ENV=production
|
||||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,3 +1,10 @@
|
|||||||
|
# Environnement local
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Composer
|
||||||
|
/vendor/
|
||||||
composer.lock
|
composer.lock
|
||||||
database/
|
|
||||||
vendor/
|
# Base de données SQLite
|
||||||
|
/database/*.sqlite
|
||||||
|
/database/*.db
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
"slim/psr7": "*",
|
"slim/psr7": "*",
|
||||||
"twig/twig": "*",
|
"twig/twig": "*",
|
||||||
"slim/twig-view": "^3.4",
|
"slim/twig-view": "^3.4",
|
||||||
"catfan/medoo": "2.*"
|
"catfan/medoo": "2.*",
|
||||||
|
"vlucas/phpdotenv": "^5.6"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|||||||
@@ -9,6 +9,26 @@ use Slim\Views\Twig;
|
|||||||
use Slim\Views\TwigMiddleware;
|
use Slim\Views\TwigMiddleware;
|
||||||
use Twig\Loader\FilesystemLoader;
|
use Twig\Loader\FilesystemLoader;
|
||||||
use Medoo\Medoo;
|
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
|
// DB SQLite + fichier
|
||||||
@@ -27,7 +47,7 @@ $dbFile = __DIR__ . '/../database/app.sqlite';
|
|||||||
ensureDatabaseFile($dbFile);
|
ensureDatabaseFile($dbFile);
|
||||||
|
|
||||||
// -------------------------
|
// -------------------------
|
||||||
// Instancier Medoo (SQLite) — compatibilité options
|
// Instancier Medoo (SQLite)
|
||||||
// -------------------------
|
// -------------------------
|
||||||
$medooOptions = [
|
$medooOptions = [
|
||||||
'database_type' => 'sqlite',
|
'database_type' => 'sqlite',
|
||||||
@@ -35,14 +55,9 @@ $medooOptions = [
|
|||||||
'error' => PDO::ERRMODE_EXCEPTION,
|
'error' => PDO::ERRMODE_EXCEPTION,
|
||||||
'charset' => 'utf8',
|
'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'])) {
|
if (!isset($medooOptions['database_name'])) {
|
||||||
$medooOptions['database_name'] = $medooOptions['database_file'];
|
$medooOptions['database_name'] = $medooOptions['database_file'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$database = new Medoo($medooOptions);
|
$database = new Medoo($medooOptions);
|
||||||
|
|
||||||
// Créer la table si nécessaire (schéma minimal)
|
// Créer la table si nécessaire (schéma minimal)
|
||||||
@@ -57,25 +72,33 @@ SQL
|
|||||||
);
|
);
|
||||||
|
|
||||||
// -------------------------
|
// -------------------------
|
||||||
// Services
|
// Services (instantiation simple et explicite)
|
||||||
// -------------------------
|
// -------------------------
|
||||||
$services = [];
|
$twig = new Twig(new FilesystemLoader(__DIR__ . '/../views'), ['cache' => false]);
|
||||||
$services['twig'] = new Twig(new FilesystemLoader(__DIR__ . '/../views'), ['cache' => false]);
|
$postRepository = new App\Repositories\PostRepositoryMedoo($database);
|
||||||
$services['db'] = $database;
|
|
||||||
$services['post_repository'] = new App\Repositories\PostRepositoryMedoo($database);
|
|
||||||
|
|
||||||
// -------------------------
|
// -------------------------
|
||||||
// Slim app
|
// Slim app
|
||||||
// -------------------------
|
// -------------------------
|
||||||
$app = AppFactory::create();
|
$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 '<html><head><meta charset="utf-8"><title>Erreur</title></head><body><h1>Erreur serveur</h1><p>Une erreur est survenue. Veuillez réessayer plus tard.</p></body></html>';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Middlewares essentiels
|
||||||
$app->addBodyParsingMiddleware();
|
$app->addBodyParsingMiddleware();
|
||||||
|
$app->add(TwigMiddleware::create($app, $twig));
|
||||||
|
|
||||||
$app->add(TwigMiddleware::create($app, $services['twig']));
|
// Charger routes (web.php reçoit explicitement $twig et $postRepository)
|
||||||
|
(require __DIR__ . '/../src/Routes/web.php')($app, $twig, $postRepository);
|
||||||
// Charger routes et injecter services
|
|
||||||
(require __DIR__ . '/../src/Routes/web.php')($app, $services);
|
|
||||||
|
|
||||||
$app->run();
|
$app->run();
|
||||||
|
|||||||
@@ -35,12 +35,10 @@ class PostRepositoryMedoo
|
|||||||
{
|
{
|
||||||
$row = $this->db->get('post', ['id', 'title', 'content'], ['id' => $id]);
|
$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) {
|
if (empty($row) || $row === false) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forcer types et clés attendues
|
|
||||||
return [
|
return [
|
||||||
'id' => (int)($row['id'] ?? 0),
|
'id' => (int)($row['id'] ?? 0),
|
||||||
'title' => (string)($row['title'] ?? ''),
|
'title' => (string)($row['title'] ?? ''),
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
use Slim\App;
|
use Slim\App;
|
||||||
|
use Slim\Views\Twig;
|
||||||
|
use App\Repositories\PostRepositoryMedoo;
|
||||||
use App\Controllers\PostController;
|
use App\Controllers\PostController;
|
||||||
|
|
||||||
return function (App $app, array $services): void {
|
return function (App $app, Twig $twig, PostRepositoryMedoo $repo): void {
|
||||||
$twig = $services['twig'];
|
|
||||||
$repo = $services['post_repository'];
|
|
||||||
$controller = new PostController($twig, $repo);
|
$controller = new PostController($twig, $repo);
|
||||||
|
|
||||||
$app->get('/', [$controller, 'index']);
|
$app->get('/', [$controller, 'index']);
|
||||||
|
|||||||
Reference in New Issue
Block a user