Add files via upload

This commit is contained in:
tips-of-mine
2025-06-14 19:03:54 +02:00
committed by GitHub
parent 2df60f551b
commit b17c666c5a
51 changed files with 4363 additions and 0 deletions

View File

@ -0,0 +1,42 @@
<?php
namespace App\Core;
/**
* Autoloader PSR-4 pour les classes de l'application.
*/
class Autoloader
{
/**
* Enregistre l'autoloader dans la pile de chargement de PHP.
*/
public static function register()
{
spl_autoload_register(function ($class) {
// Préfixe du namespace de l'application
$prefix = 'App\\';
// Répertoire de base où se trouvent les fichiers de l'application (src/)
$baseDir = __DIR__ . '/../'; // Cela pointe vers /app/src/
// Vérifie si la classe utilise le préfixe du namespace
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// Si la classe n'utilise pas notre préfixe, passe au prochain autoloader enregistré
return;
}
// Récupère le nom de la classe relatif au namespace de base
$relativeClass = substr($class, $len);
// Convertit le nom de la classe relatif en chemin de fichier
// Remplace les séparateurs de namespace par des séparateurs de répertoire et ajoute l'extension .php
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
// Si le fichier existe, l'inclut
if (file_exists($file)) {
require $file;
}
});
}
}

71
app/src/Core/Database.php Normal file
View File

@ -0,0 +1,71 @@
<?php
namespace App\Core;
use PDO;
use PDOException;
/**
* Classe singleton pour gérer la connexion à la base de données MySQL.
*/
class Database
{
private static $instance = null; // Instance unique de la connexion PDO
private $conn; // L'objet de connexion PDO
/**
* Constructeur privé pour empêcher l'instanciation directe (Singleton).
*
* @param string $host Nom d'hôte de la base de données
* @param string $dbName Nom de la base de données
* @param string $user Nom d'utilisateur de la base de données
* @param string $password Mot de passe de la base de données
* @throws PDOException Si la connexion échoue
*/
private function __construct($host, $dbName, $user, $password)
{
$dsn = "mysql:host=$host;dbname=$dbName;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Rapporte les erreurs SQL sous forme d'exceptions
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Récupère les résultats sous forme de tableaux associatifs
PDO::ATTR_EMULATE_PREPARES => false, // Désactive l'émulation des requêtes préparées pour une meilleure sécurité
];
try {
$this->conn = new PDO($dsn, $user, $password, $options);
} catch (PDOException $e) {
// Log l'erreur plutôt que de l'afficher directement en production
error_log("Erreur de connexion à la base de données: " . $e->getMessage());
// Relance l'exception après l'avoir logguée
throw new PDOException("Impossible de se connecter à la base de données.", (int)$e->getCode());
}
}
/**
* Connecte à la base de données ou retourne l'instance existante.
*
* @param string $host Nom d'hôte de la base de données
* @param string $dbName Nom de la base de données
* @param string $user Nom d'utilisateur de la base de données
* @param string $password Mot de passe de la base de données
*/
public static function connect($host, $dbName, $user, $password)
{
if (self::$instance === null) {
self::$instance = new Database($host, $dbName, $user, $password);
}
}
/**
* Retourne l'instance PDO de la connexion à la base de données.
*
* @return PDO L'objet de connexion PDO
* @throws \Exception Si la connexion n'a pas été établie au préalable
*/
public static function getInstance()
{
if (self::$instance === null) {
throw new \Exception("La base de données n'est pas connectée. Appelez Database::connect() d'abord.");
}
return self::$instance->conn;
}
}

91
app/src/Core/Router.php Normal file
View File

@ -0,0 +1,91 @@
<?php
namespace App\Core;
use App\Services\AuthService;
use App\Utils\DarkMode; // Assurez-vous d'importer la classe DarkMode
/**
* Simple routeur pour diriger les requêtes HTTP vers les contrôleurs appropriés.
*/
class Router
{
private $routes = []; // Tableau pour stocker toutes les routes définies
private $authService; // Service d'authentification pour vérifier l'accès aux routes protégées
/**
* Constructeur du routeur.
* Initialise le service d'authentification.
*/
public function __construct()
{
$this->authService = new AuthService(Database::getInstance());
}
/**
* Ajoute une nouvelle route au routeur.
*
* @param string $method Méthode HTTP (GET, POST, etc.)
* @param string $path Chemin de l'URL (ex: '/', '/dashboard')
* @param string $controllerAction Action du contrôleur (ex: 'HomeController@index')
* @param bool $requiresAuth Indique si la route nécessite une authentification (true par défaut)
*/
public function addRoute($method, $path, $controllerAction, $requiresAuth = false)
{
$this->routes[] = [
'method' => $method,
'path' => $path,
'controllerAction' => $controllerAction,
'requiresAuth' => $requiresAuth
];
}
/**
* Dispatche la requête entrante vers le contrôleur et l'action correspondants.
* Gère également les redirections pour l'authentification et les erreurs 404.
*/
public function dispatch()
{
// Récupère le chemin de l'URL demandé (sans les paramètres GET)
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// Récupère la méthode HTTP de la requête (GET, POST, etc.)
$requestMethod = $_SERVER['REQUEST_METHOD'];
foreach ($this->routes as $route) {
// Vérifie si la méthode et le chemin correspondent à une route définie
if ($route['method'] === $requestMethod && $route['path'] === $requestUri) {
// Si la route nécessite une authentification et que l'utilisateur n'est pas connecté
if ($route['requiresAuth'] && !$this->authService->isLoggedIn()) {
// Redirige vers la page de connexion
header('Location: /login');
exit();
}
// Sépare le nom du contrôleur et de l'action
list($controllerName, $actionName) = explode('@', $route['controllerAction']);
// Construit le nom complet de la classe du contrôleur avec son namespace
$controllerClass = "App\\Controllers\\" . $controllerName;
// Vérifie si la classe du contrôleur existe
if (class_exists($controllerClass)) {
// Instancie le contrôleur
$controller = new $controllerClass();
// Vérifie si la méthode de l'action existe dans le contrôleur
if (method_exists($controller, $actionName)) {
// Appelle la méthode de l'action
$controller->$actionName();
return; // Termine l'exécution après avoir traité la route
}
}
}
}
// Si aucune route correspondante n'est trouvée, retourne une erreur 404
http_response_code(404);
// Utilisation de DarkMode::getBodyClass() pour éviter l'erreur de syntaxe
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>404 Non Trouvé</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body class=\"" . DarkMode::getBodyClass() . "\">";
echo "<div class=\"container\"><h1>404 Non Trouvé</h1>";
echo "<p>La page que vous avez demandée n'a pas pu être trouvée.</p>";
echo "<p><a href=\"/\">Retour à l'accueil</a></p></div></body></html>";
}
}