mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-07-05 01:48:42 +02:00
Add files via upload
This commit is contained in:
42
app/src/Core/Autoloader.php
Normal file
42
app/src/Core/Autoloader.php
Normal 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
71
app/src/Core/Database.php
Normal 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
91
app/src/Core/Router.php
Normal 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>";
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user