adja / core-ex
core normal
Requires
- php: ^8.3
This package is auto-updated.
Last update: 2026-08-27 20:33:17 UTC
README
Adja Core est une bibliothèque PHP légère, modulaire et réutilisable conçue pour servir de socle aux applications PHP orientées objet et aux architectures MVC fondées sur le concept d'héritage.
Elle fournit les composants essentiels pour structurer une application : contrôleur de base, gestionnaire de base de données, requêtes HTTP, sessions, validation, helpers et outils de débogage.
Sommaire
- Prérequis
- Installation
- Autoload PSR-4
- Fonctionnalités
- Structure du package
- Exemple d'utilisation dans une architecture MVC
- Auteur
- Licence
Prérequis
Avant d'utiliser Adja Core, votre environnement doit disposer de :
- PHP 8.3 ou supérieur
- Composer
- PDO (
pdo_pgsqlpour PostgreSQL,pdo_mysqlpour MySQL) - mbstring
Installation
Installez le package avec Composer :
composer require adja/core-ex
Dans votre application PHP, chargez l'autoloader :
<?php require_once __DIR__ . '/vendor/autoload.php';
Autoload PSR-4
Adja Core utilise l'autoloading PSR-4 avec le namespace My\Core\ :
{
"autoload": {
"psr-4": {
"My\\Core\\": "src/"
}
}
}
Toutes les classes du package sont situées dans le dossier src/ :
namespace My\Core;
Après modification de l'autoload, régénérez-le avec :
composer dump-autoload
Fonctionnalités
1. Controller (Héritage)
La classe abstraite My\Core\Controller sert de classe mère pour tous vos contrôleurs. Vos contrôleurs héritent des méthodes de rendu de vue et de redirection grâce au mot-clé extends.
Exemple de contrôleur enfant
<?php namespace App\Controller; use My\Core\Controller; class UserController extends Controller { public function index(): void { $users = [ ['id' => 1, 'nom' => 'Adja'] ]; // Rendu simple d'une vue (ex: views/users/index.php) $this->renderView('users', [ 'title' => 'Liste des utilisateurs', 'users' => $users ]); } public function showProfile(): void { // Rendu avec layout (ex: views/users/index.php dans views/layout/app.php) $this->renderViewLayout('users', 'app', [ 'title' => 'Profil utilisateur' ]); } public function store(): void { // Traitement... // Redirection vers une route $this->redirectToRoute('users'); } }
Méthodes protégées disponibles (via $this->) :
$this->renderView(string $folder, array $data = [], string $viewsPath = 'views'): Charge et affiche la vueindex.phpdu dossier spécifié.$this->renderViewLayout(string $folder, string $layout, array $data = [], string $viewsPath = 'views'): Injecte la vue dans la variable$contentViewdu layout.$this->redirectToRoute(string $uri, string $baseUrl = ''): Effectue une redirection HTTPLocationet stoppe le script.
2. Database (Héritage)
La classe abstraite My\Core\Database centralise la connexion PDO et l'exécution des requêtes SQL. Elle est conçue pour être étendue par vos classes Repositories ou Modèles.
Initialisation globale de la connexion
À configurer au démarrage de l'application (ex: dans public/index.php) :
<?php use My\Core\Database; // Exemple PostgreSQL : Database::init( host: 'localhost', port: 5432, database: 'mon_app_db', username: 'postgres', password: 'secret_password', driver: 'pgsql' ); // Exemple MySQL : Database::init( host: '127.0.0.1', port: 3306, database: 'mon_app_db', username: 'root', password: '', driver: 'mysql' );
Exemple de Repository enfant qui hérite de Database
<?php namespace App\Model\Repository; use My\Core\Database; class UserRepository extends Database { public function findById(int $id): ?object { // executeQuery() est directement héritée de Database return $this->executeQuery( 'SELECT * FROM users WHERE id = :id', ['id' => $id], true ); } public function findAll(): array { return $this->executeQuery( 'SELECT * FROM users ORDER BY id DESC', [], false ); } public function create(string $nom, string $email): int|string { return $this->executeUpdate( 'INSERT INTO users (nom, email) VALUES (:nom, :email)', ['nom' => $nom, 'email' => $email] ); } public function update(int $id, string $nom): int { return (int) $this->executeUpdate( 'UPDATE users SET nom = :nom WHERE id = :id', ['nom' => $nom, 'id' => $id] ); } public function delete(int $id): int { return (int) $this->executeUpdate( 'DELETE FROM users WHERE id = :id', ['id' => $id] ); } }
3. Request
La classe My\Core\Request permet d'accéder facilement aux données HTTP de manière statique :
<?php use My\Core\Request; if (Request::isPost()) { $email = Request::post('email', ''); } if (Request::isGet()) { $page = (int) Request::get('page', 1); } $method = Request::getMethod(); // 'GET', 'POST', etc. $allData = Request::all(); // Contenu combiné GET / POST $uri = Request::uri(); // Chemin URL
4. Validator
La classe My\Core\Validator permet de valider les formulaires et de collecter les erreurs dans un tableau :
<?php use My\Core\Validator; $errors = []; $nom = $_POST['nom'] ?? null; $email = $_POST['email'] ?? null; $quantite = $_POST['quantite'] ?? null; Validator::required($nom, 'nom', $errors, 'Le nom est obligatoire.'); Validator::minLength($nom, 3, 'nom', $errors, 'Le nom doit contenir au moins 3 caractères.'); Validator::maxLength($nom, 50, 'nom', $errors, 'Le nom ne doit pas dépasser 50 caractères.'); Validator::isEmail($email, 'email', $errors, 'Adresse email invalide.'); Validator::isPositive($quantite, 'quantite', $errors, 'La quantité doit être positive.'); if (Validator::hasErrors($errors)) { // Il y a des erreurs de validation }
Méthodes disponibles
| Méthode | Description |
|---|---|
required($val, $key, &$errors, $msg) |
Vérifie qu'une valeur n'est ni nulle ni vide |
isPositive($val, $key, &$errors, $msg) |
Vérifie qu'un nombre est supérieur ou égal à 0 |
isGreaterThanZero($val, $key, &$errors, $msg) |
Vérifie qu'un nombre est strictement positif (> 0) |
isEmail($val, $key, &$errors, $msg) |
Valide le format d'adresse email |
minLength($val, $min, $key, &$errors, $msg) |
Vérifie la taille minimale d'une chaîne |
maxLength($val, $max, $key, &$errors, $msg) |
Vérifie la taille maximale d'une chaîne |
unique($val, $key, $datas, &$errors, $req, $msg) |
Vérifie l'unicité d'une valeur dans un ensemble |
hasErrors($errors) |
Renvoie true si le tableau d'erreurs n'est pas vide |
5. SessionManager
My\Core\SessionManager encapsule et sécurise la manipulation de $_SESSION :
<?php use My\Core\SessionManager; // Stocker des données SessionManager::setData('user', ['id' => 1, 'nom' => 'Adja']); // Récupérer des données (avec valeur par défaut facultative) $user = SessionManager::getData('user'); $page = SessionManager::getData('page', 1); // Vérifier l'existence d'une clé if (SessionManager::hasKey('user')) { // Utilisateur connecté } // Supprimer une clé SessionManager::removeData('user'); // Récupérer toutes les variables de session $all = SessionManager::getAllSession(); // Vider la session SessionManager::clearSession(); // Détruire complètement la session et son cookie SessionManager::destroySession();
6. Helpers
My\Core\Helpers fournit des méthodes utilitaires pour les vues PHP :
<?php use My\Core\Helpers;
Assets et Liens
<!-- Lien vers un asset statique --> <link rel="stylesheet" href="<?= Helpers::asset('css/style.css', '/mon-app') ?>"> <!-- Générer une URL --> <a href="<?= Helpers::pathUrl('users/create') ?>">Nouveau</a>
Formulaires et Navigation
<!-- Récupérer l'ancienne valeur d'un champ --> <input type="text" name="nom" value="<?= Helpers::old($_POST, 'nom') ?>"> <!-- Pré-sélectionner une option dans un <select> --> <option value="1" <?= Helpers::selected($selectedId, 1) ?>>Admin</option> <!-- Cocher une checkbox --> <input type="checkbox" name="actif" <?= Helpers::checked($status, 'actif') ?>> <!-- Appliquer une classe active sur un menu --> <a href="/users" class="<?= Helpers::active($currentUri, '/users') ?>">Utilisateurs</a>
7. Debug
My\Core\Debug permet d'inspecter rapidement les variables lors du développement :
<?php use My\Core\Debug; // Affichage formaté sans stopper l'exécution Debug::dump($data); // Affichage formaté puis arrêt immédiat du script (exit) Debug::dd($data);
Structure du package
core-ex/
├── src/
│ ├── Controller.php # Classe abstraite de base pour les contrôleurs
│ ├── Database.php # Classe abstraite de base pour les repositories/modèles
│ ├── Debug.php # Outils de débogage (dump, dd)
│ ├── Helpers.php # Aides pour les vues (assets, formulaires, urls)
│ ├── Request.php # Gestion des requêtes HTTP (GET, POST, uri)
│ ├── SessionManager.php # Gestionnaire de sessions PHP
│ └── Validator.php # Validateur de formulaires
├── composer.json
├── README.md
└── LICENSE
Exemple d'utilisation dans une architecture MVC
<?php namespace App\Controller; use My\Core\Controller; use My\Core\Request; use My\Core\Validator; use My\Core\SessionManager; use App\Model\Repository\UserRepository; class AuthController extends Controller { private UserRepository $userRepository; public function __construct() { $this->userRepository = new UserRepository(); } public function login(): void { $errors = []; if (Request::isPost()) { $email = trim((string) Request::post('email', '')); $password = (string) Request::post('password', ''); Validator::required($email, 'email', $errors, "L'email est obligatoire."); Validator::isEmail($email, 'email', $errors, "Email invalide."); Validator::required($password, 'password', $errors, "Le mot de passe est obligatoire."); if (!Validator::hasErrors($errors)) { $user = $this->userRepository->findByEmail($email); if ($user && password_verify($password, $user->password)) { SessionManager::setData('userConnect', $user); $this->redirectToRoute('dashboard'); } else { $errors['auth'] = "Identifiants incorrects."; } } } $this->renderView('auth/login', [ 'errors' => $errors ]); } }
Auteur
AdjaNdour
Email : adjacourandour4@gmail.com
Licence
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.