moved db name into config

This commit is contained in:
julien
2026-03-04 04:20:45 +01:00
parent 99f274e3d1
commit 7f906b6199
2 changed files with 94 additions and 17 deletions

View File

@@ -1,56 +1,90 @@
<?php <?php
declare(strict_types=1); declare(strict_types=1);
/* -------------------------------------------------
* Autoload Composer + notre configuration RedBean
* ------------------------------------------------- */
require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../src/Config/redbean.php'; require __DIR__ . '/../src/Config/redbean.php';
/* -------------------------------------------------
* Imports (facades, DI, Slim, Twig, etc.)
* ------------------------------------------------- */
use DI\ContainerBuilder; use DI\ContainerBuilder;
use Slim\Factory\AppFactory; use Slim\Factory\AppFactory;
use Slim\Views\Twig; use Slim\Views\Twig;
use Slim\Views\TwigMiddleware; use Slim\Views\TwigMiddleware;
use Twig\Loader\FilesystemLoader; use Twig\Loader\FilesystemLoader;
use RedBeanPHP\R; // <-- import de la façade RedBean use RedBeanPHP\R; // façade RedBean (nécessaire pour le service DB)
// ------------------------------------------------- /* -------------------------------------------------
// Conteneur DI * Construction du conteneur DI
// ------------------------------------------------- * ------------------------------------------------- */
$containerBuilder = new ContainerBuilder(); $containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions([ $containerBuilder->addDefinitions([
// Twig /* -------------------------------------------------
* Service Twig (template engine)
* ------------------------------------------------- */
Twig::class => function () { Twig::class => function () {
$loader = new FilesystemLoader(__DIR__ . '/../views'); $loader = new FilesystemLoader(__DIR__ . '/../views');
return new Twig($loader, ['cache' => false]); // désactivé en dev // En développement on désactive le cache pour voir les changements immédiatement
return new Twig($loader, ['cache' => false]);
}, },
// RedBean service DB /* -------------------------------------------------
* Service « db » connexion RedBean
* ------------------------------------------------- */
'db' => function () { 'db' => function () {
$dbPath = __DIR__ . '/../database/app.sqlite'; // Le chemin du fichier SQLite est déterminé dans redbean.php
initRedBean($dbPath); // crée le fichier + connexion $dbPath = getDefaultDbPath(); // ex. …/database/app.sqlite ou autre via DB_FILE
return R::getDatabaseAdapter(); // valeur retournée (facultatif) initRedBean($dbPath); // crée le fichier + lance R::setup()
// Retourner ladaptateur (facultatif, on le garde pour que le service existe)
return R::getDatabaseAdapter();
}, },
// …autres services // -----------------------------------------------------------------
// Ajoutez dautres services ici (logger, repository, etc.)
// -----------------------------------------------------------------
]); ]);
/* -------------------------------------------------
* Build du conteneur
* ------------------------------------------------- */
$container = $containerBuilder->build(); $container = $containerBuilder->build();
/* ------------------------------------------------- /* -------------------------------------------------
Initialise la connexion DB dès le bootstrap * Initialise la connexion DB dès le bootstrap
------------------------------------------------- */ * ------------------------------------------------- */
$container->get('db'); // déclenche initRedBean() avant le chargement des routes $container->get('db'); // déclenche initRedBean() avant le chargement des routes
/* -------------------------------------------------
* Instanciation de lapplication Slim avec le conteneur
* ------------------------------------------------- */
AppFactory::setContainer($container); AppFactory::setContainer($container);
$app = AppFactory::create(); $app = AppFactory::create();
/* -------------------------------------------------
* Middleware derreur (affiche les traces en dev)
* ------------------------------------------------- */
$app->addErrorMiddleware(true, true, true); $app->addErrorMiddleware(true, true, true);
/* -------------------------------------------------
* Middleware Twig rend les vues disponibles
* ------------------------------------------------- */
$twig = $container->get(Twig::class); $twig = $container->get(Twig::class);
$app->add(TwigMiddleware::create($app, $twig)); $app->add(TwigMiddleware::create($app, $twig));
/* -------------------------------------------------
* Chargement dynamique de toutes les définitions de routes
* ------------------------------------------------- */
foreach (glob(__DIR__ . '/../src/Routes/*.routes.php') as $file) { foreach (glob(__DIR__ . '/../src/Routes/*.routes.php') as $file) {
// Chaque fichier retourne une closure qui reçoit $app
(require $file)($app); (require $file)($app);
} }
/* -------------------------------------------------
* Démarrage de lapplication
* ------------------------------------------------- */
$app->run(); $app->run();

View File

@@ -4,22 +4,65 @@ declare(strict_types=1);
use RedBeanPHP\R; use RedBeanPHP\R;
/** /**
* Crée le fichier SQLite sil nexiste pas. * -----------------------------------------------------------------
* Helper crée le fichier SQLite sil nexiste pas.
* -----------------------------------------------------------------
*
* @param string $path Chemin complet du fichier SQLite.
*/ */
function ensureDatabaseFile(string $path): void function ensureDatabaseFile(string $path): void
{ {
if (!file_exists($path)) { if (!file_exists($path)) {
// crée un fichier vide
touch($path); touch($path);
chmod($path, 0664); // rwrwr-- // permissions rwrwr-- (0664) suffisantes pour le serveur web
chmod($path, 0664);
} }
} }
/** /**
* Initialise RedBeanPHP avec SQLite. * -----------------------------------------------------------------
* Initialise RedBeanPHP avec le driver SQLite.
* -----------------------------------------------------------------
*
* Cette fonction :
* 1. Sassure que le fichier SQLite existe (via ensureDatabaseFile()).
* 2. Lance R::setup() avec le préfixe « sqlite: ».
* 3. Définit le mode « freeze » (false en dev, true en prod).
*
* @param string $dbPath Chemin complet du fichier SQLite.
*/ */
function initRedBean(string $dbPath): void function initRedBean(string $dbPath): void
{ {
// 1. création éventuelle du fichier
ensureDatabaseFile($dbPath); ensureDatabaseFile($dbPath);
// 2. connexion à la base SQLite
R::setup('sqlite:' . $dbPath); R::setup('sqlite:' . $dbPath);
R::freeze(false); // false en dev, true en prod
// 3. pendant le développement on laisse freeze à false
// (RedBean crée/modifie les tables automatiquement)
R::freeze(false);
}
/**
* -----------------------------------------------------------------
* Retourne le chemin par défaut du fichier SQLite.
* -----------------------------------------------------------------
*
* Le nom du fichier peut être surchargé via la variable denvironnement
* DB_FILE (ou via un .env chargé par lapplication). Ainsi on évite
* de coder en dur le nom du fichier dans le bootstrap.
*
* @return string Chemin absolu du fichier SQLite.
*/
function getDefaultDbPath(): string
{
// Le répertoire « database » se trouve deux niveaux au-dessus de ce fichier
$baseDir = realpath(__DIR__ . '/../../database');
// Nom du fichier valeur par défaut « app.sqlite »
$fileName = getenv('DB_FILE') ?: 'app.sqlite';
return $baseDir . DIRECTORY_SEPARATOR . $fileName;
} }