PHPackages                             zaff/challenge2 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. zaff/challenge2

ActiveProject[Framework](/categories/framework)

zaff/challenge2
===============

Miniframe PHP MVC

v1.0.0(11mo ago)02PHP

Since Jul 25Pushed 11mo agoCompare

[ Source](https://github.com/SNcodeur2001/miniFrameworkChallenge2)[ Packagist](https://packagist.org/packages/zaff/challenge2)[ RSS](/packages/zaff-challenge2/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (1)Versions (2)Used By (0)

Mini-Framework PHP MVC Challenge2
=================================

[](#mini-framework-php-mvc-challenge2)

Un mini-framework PHP léger implémentant le pattern MVC avec support multi-base de données, système de routage, middlewares et gestion de sessions.

🚀 Installation
--------------

[](#-installation)

```
composer require zaff/challenge2
```

📋 Prérequis
-----------

[](#-prérequis)

- PHP 8.0+
- Composer
- Base de données (MySQL, PostgreSQL ou SQLite)

🏗️ Structure du Projet
----------------------

[](#️-structure-du-projet)

```
miniFrameworkChallenge2/
├── config/
│   ├── core/                    # Classes du framework
│   │   ├── AbstractController.php
│   │   ├── AbstractEntity.php
│   │   ├── AbstractRepository.php
│   │   ├── App.php              # Container d'injection de dépendances
│   │   ├── Database.php         # Connexion base de données
│   │   ├── DatabaseFactory.php  # Factory pour la DB
│   │   ├── Router.php           # Système de routage
│   │   ├── Session.php          # Gestion des sessions
│   │   ├── Validator.php        # Validation des données
│   │   └── middleware.php       # Middlewares d'authentification
│   ├── bootstrap.php            # Initialisation
│   ├── env.php                  # Configuration environnement
│   └── helpers.php              # Fonctions utilitaires
├── controller/                  # Contrôleurs de l'application
├── src/
│   ├── entities/               # Entités métier
│   ├── repository/             # Couche d'accès aux données
│   └── service/                # Services métier
├── template/                   # Vues et templates
│   └── layout/                 # Layouts de base
├── route/
│   └── route.web.php           # Définition des routes
├── public/
│   └── index.php               # Point d'entrée
├── .env                        # Variables d'environnement
└── composer.json

```

⚙️ Configuration
----------------

[](#️-configuration)

### 1. Variables d'environnement

[](#1-variables-denvironnement)

Créez un fichier `.env` à la racine du projet :

```
APP_URL=http://localhost:8000

# Choix du driver : pgsql, mysql ou sqlite
DB_DRIVER=mysql

# Pour PostgreSQL/MySQL
DB_HOST=localhost
DB_PORT=3306
DB_NAME=votre_base
DB_USER=votre_utilisateur
DB_PASSWORD=votre_mot_de_passe

# Pour SQLite (optionnel)
# DB_PATH=/chemin/vers/ta_base.sqlite
```

### 2. Autoloading PSR-4

[](#2-autoloading-psr-4)

Le framework utilise l'autoloading PSR-4 configuré dans `composer.json` :

```
{
    "autoload": {
        "psr-4": {
            "Vendor\\Challenge2\\": "src/",
            "App\\Entity\\": "src/entities/",
            "App\\Config\\Core\\": "config/core/",
            "App\\Repository\\": "src/repository/",
            "App\\Service\\": "src/service/",
            "App\\Controller\\": "controller/"
        }
    }
}
```

🛣️ Système de Routage
---------------------

[](#️-système-de-routage)

### Définition des routes

[](#définition-des-routes)

Dans `route/route.web.php` :

```
use App\Config\Core\Router;
use App\Controller\CommandeController;
use App\Controller\SecurityController;

// Routes publiques
Router::get('/', SecurityController::class, 'index');
Router::post('/login', SecurityController::class, 'authenticate');

// Routes protégées par middleware
Router::get('/list', CommandeController::class, 'index', ['auth']);
Router::get('/form', CommandeController::class, 'create', ['auth', 'isVendeur']);

// Résolution des routes
Router::resolve();
```

### Méthodes disponibles

[](#méthodes-disponibles)

- `Router::get($uri, $controller, $action, $middlewares = [])`
- `Router::post($uri, $controller, $action, $middlewares = [])`

🎮 Contrôleurs
-------------

[](#-contrôleurs)

### Contrôleur abstrait

[](#contrôleur-abstrait)

Tous les contrôleurs héritent de `AbstractController` :

```
use App\Config\Core\AbstractController;

class MonController extends AbstractController
{
    public function index()
    {
        // Logique pour lister
        $this->renderHtml('ma_vue.php', ['data' => $data]);
    }

    public function create()
    {
        // Logique pour créer
    }

    public function store()
    {
        // Logique pour sauvegarder
    }

    public function show()
    {
        // Logique pour afficher un élément
    }

    public function edit()
    {
        // Logique pour éditer
    }

    public function destroy()
    {
        // Logique pour supprimer
    }
}
```

### Méthodes obligatoires

[](#méthodes-obligatoires)

Chaque contrôleur doit implémenter ces méthodes :

- `index()` - Lister les éléments
- `create()` - Afficher le formulaire de création
- `store()` - Traiter la création
- `show()` - Afficher un élément
- `edit()` - Afficher le formulaire d'édition
- `destroy()` - Supprimer un élément

### Rendu des vues

[](#rendu-des-vues)

```
protected function renderHtml(string $view, array $params = [])
{
    // $view : chemin vers la vue (ex: 'commande/list.php')
    // $params : données à passer à la vue
}
```

🗄️ Base de Données
------------------

[](#️-base-de-données)

### Support multi-base

[](#support-multi-base)

Le framework supporte trois types de bases de données :

- **MySQL** : `DB_DRIVER=mysql`
- **PostgreSQL** : `DB_DRIVER=pgsql`
- **SQLite** : `DB_DRIVER=sqlite`

### Connexion

[](#connexion)

```
use App\Config\Core\Database;

$pdo = Database::getConnection();
```

### Container d'injection de dépendances

[](#container-dinjection-de-dépendances)

```
use App\Config\Core\App;

// Récupérer une dépendance
$pdo = App::get('pdo');
```

📊 Modèles et Repositories
-------------------------

[](#-modèles-et-repositories)

### Entité abstraite

[](#entité-abstraite)

```
use App\Config\Core\AbstractEntity;

class MonEntity extends AbstractEntity
{
    public static function toObject(array $tableau): static
    {
        // Convertir un tableau en objet
    }

    public function toArray(Object $object): array
    {
        // Convertir un objet en tableau
    }
}
```

### Repository abstrait

[](#repository-abstrait)

```
abstract class AbstractRepository
{
    abstract public function selectAll();
    abstract public function insert();
    abstract public function update();
    abstract public function delete();
    abstract public function selectById();
    abstract public function selectBy(Array $filtre);
}
```

🔐 Authentification et Middlewares
---------------------------------

[](#-authentification-et-middlewares)

### Middlewares disponibles

[](#middlewares-disponibles)

- `auth` - Vérifier si l'utilisateur est connecté
- `isVendeur` - Vérifier si l'utilisateur est un vendeur
- `isClient` - Vérifier si l'utilisateur est un client

### Utilisation

[](#utilisation)

```
// Route protégée par authentification
Router::get('/dashboard', Controller::class, 'index', ['auth']);

// Route pour vendeurs uniquement
Router::get('/admin', Controller::class, 'admin', ['auth', 'isVendeur']);
```

### Création de middlewares personnalisés

[](#création-de-middlewares-personnalisés)

Dans `config/core/middleware.php` :

```
$middlewares['monMiddleware'] = 'maFonction';

function maFonction()
{
    // Logique du middleware
    if (!$condition) {
        header('Location: /erreur');
        exit;
    }
}
```

🔧 Session
---------

[](#-session)

### Utilisation

[](#utilisation-1)

```
use App\Config\Core\Session;

$session = Session::getInstance();

// Définir une valeur
$session->set('user_id', 123);

// Récupérer une valeur
$userId = $session->get('user_id');

// Vérifier l'existence
if ($session->isset('user_id')) {
    // ...
}

// Supprimer une clé
$session->unset('user_id');

// Détruire la session
$session->destroy();
```

✅ Validation
------------

[](#-validation)

### Utilisation du validateur

[](#utilisation-du-validateur)

```
use App\Config\Core\Validator;

$validator = new Validator();

// Validation email
$validator->isEmail('email', $email, 'Email invalide');

// Validation champ vide
$validator->isEmpty('nom', $nom, 'Le nom est requis');

// Vérifier les erreurs
if ($validator->isValid()) {
    // Aucune erreur
} else {
    $errors = $validator->getErrors();
}
```

🎨 Vues et Layouts
-----------------

[](#-vues-et-layouts)

### Structure des templates

[](#structure-des-templates)

```
template/
├── layout/
│   └── base.layout.php     # Layout de base
├── commande/
│   ├── list.php           # Vue liste
│   ├── form.php           # Vue formulaire
│   └── 404.php            # Page d'erreur

```

### Layout de base

[](#layout-de-base)

Le contenu de la vue est injecté dans la variable `$contentForLayout` :

```
DOCTYPE html>

    Mon App

```

🛠️ Utilitaires
--------------

[](#️-utilitaires)

### Fonction de debug

[](#fonction-de-debug)

```
// Dans config/helpers.php
dd($variable); // Affiche et arrête l'exécution
```

🚀 Démarrage Rapide
------------------

[](#-démarrage-rapide)

1. **Installation**

    ```
    composer require zaff/challenge2
    ```
2. **Configuration**

    ```
    cp .env.example .env
    # Éditer le fichier .env avec vos paramètres
    ```
3. **Créer un contrôleur**

    ```
    // controller/MonController.php
    class MonController extends AbstractController
    {
        public function index()
        {
            $this->renderHtml('ma_vue.php', ['titre' => 'Bonjour']);
        }

        // Implémenter les autres méthodes...
    }
    ```
4. **Définir les routes**

    ```
    // route/route.web.php
    Router::get('/ma-route', MonController::class, 'index');
    ```
5. **Lancer le serveur**

    ```
    php -S localhost:8000 -t public/
    ```

📝 Notes Importantes
-------------------

[](#-notes-importantes)

- Le framework utilise le pattern Singleton pour la session et la base de données
- Les middlewares sont exécutés dans l'ordre de déclaration
- Toutes les vues doivent être placées dans le dossier `template/`
- Le container `App` centralise toutes les dépendances du projet
- Le système de routage supporte uniquement GET et POST

🤝 Contribution
--------------

[](#-contribution)

Pour contribuer au projet :

1. Fork le repository
2. Créer une branche feature
3. Committer vos changements
4. Pousser vers la branche
5. Créer une Pull Request

👥 Auteur
--------

[](#-auteur)

**Moustapha Seck** - Développeur principal

---

*Ce mini-framework est conçu pour l'apprentissage et les projets de petite à moyenne envergure. Il implémente les patterns MVC classiques avec une approche moderne.*

###  Health Score

25

—

LowBetter than 35% of packages

Maintenance51

Moderate activity, may be stable

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity36

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

344d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/116581490?v=4)[Mapathé Ndiaye](/maintainers/SNcodeur2001)[@SNcodeur2001](https://github.com/SNcodeur2001)

---

Top Contributors

[![SNcodeur2001](https://avatars.githubusercontent.com/u/116581490?v=4)](https://github.com/SNcodeur2001 "SNcodeur2001 (5 commits)")

### Embed Badge

![Health badge](/badges/zaff-challenge2/health.svg)

```
[![Health](https://phpackages.com/badges/zaff-challenge2/health.svg)](https://phpackages.com/packages/zaff-challenge2)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.8k543.8M20.1k](/packages/laravel-framework)[tempest/framework

The PHP framework that gets out of your way.

2.2k34.4k15](/packages/tempest-framework)[doppar/framework

The Doppar Framework

4012.4k14](/packages/doppar-framework)[lion/bundle

Lion-framework configuration and initialization package

122.3k4](/packages/lion-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
