Fennec

Un micro-framework PHP écrit from scratch, sans Composer et sans dépendance externe : routing par attributs, conteneur DI par autowiring, JWT maison, pipeline de middlewares et gestion centralisée des erreurs.

PHP 8.3+ Zéro dépendance API-first JSON MySQL / PDO JWT maison Licence MIT
Fennec, le renard mascotte, posé sur le logo PHP
Pourquoi Fennec

Une vitrine technique, entièrement fonctionnelle

Ce n'est pas une maquette : chaque module — routing, injection de dépendances, sécurité, gestion d'erreurs — est implémenté et opérationnel de bout en bout. Le construire from scratch, brique par brique, permet de démontrer une compréhension fine des mécanismes internes d'un framework moderne, tout en restant utilisable pour de vrais projets.

📦

Zéro dépendance

Aucune librairie runtime, pas de Composer — ni pour l'autoload, ni pour quoi que ce soit d'autre.

🔀

API-first / JSON only

Pas de rendu HTML côté serveur : une seule forme de réponse, JsonResponse, toujours structurée.

🧱

Frontière stricte

fennec/src (namespace Fennec\) ne référence jamais App\ — extractible tel quel dans un autre projet.

⚠️

Erreurs explicites

Chaque échec prévisible lève une exception typée et documentée — jamais un retour silencieux.

Architecture

12 modules, un ordre de dépendances assumé

Chaque brique s'appuie sur les précédentes — de l'autoload jusqu'à la documentation générée.

01

Autoload

spl_autoload_register, mapping Fennec\/fennec, App\/src.

02

Config

Parseur .env.local avec typage automatique des valeurs non citées.

03

Http

Request et JsonResponse, enveloppe JSON stable succès/erreur.

04

Container

Injection de dépendances par autowiring Reflection — bind, singleton, instance.

05

Routing

Attributs PHP 8 #[Route], paramètres dynamiques, cache de routes compilé.

06

Middleware

Pipeline exécuté autour d'un handler final via des closures imbriquées.

07

Security

Firewall fail-closed, JWT HS256 maison, RBAC à 4 rôles hiérarchiques.

08

Database

Wrapper PDO, requêtes exclusivement préparées — jamais de concaténation SQL.

09

Logger

Journal JSON structuré, un fichier par jour dans var/logs/.

10

Exception Handling

Handler centralisé au niveau du Kernel, mapping type d'exception → code HTTP.

11

Console

bin/console et ses commandes natives : route:cache, key:generate...

12

Documentation

PHPDoc systématique + mini-site généré pour la démonstration portfolio.

En pratique

Un controller, une route, une réponse

Pas d'interface à implémenter, pas d'héritage obligatoire — un attribut suffit.

src/Controller/ProjectController.php

<?php

declare(strict_types=1);

namespace App\Controller;

use Fennec\Http\JsonResponse;
use Fennec\Http\Request;
use Fennec\Routing\Route;

final class ProjectController
{
    #[Route('/api/projects', methods: ['GET'])]
    public function list(Request $request): JsonResponse
    {
        return JsonResponse::success([
            'projects' => [],
        ]);
    }
}

Réponse HTTP — succès / erreur

// 200 OK
{
  "success": true,
  "data": { "projects": [] },
  "meta": null
}

// 422 Unprocessable Entity
{
  "success": false,
  "data": null,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "...",
    "details": { "title": "Ce champ est requis." }
  },
  "meta": null
}
Stack technique

Ce qui fait tourner Fennec

PHP 8.3+ strict_types Attributs PHP 8 PDO / MySQL JWT HS256 maison spl_autoload_register Reflection API Aucune dépendance Composer

Voir comment c'est construit

Guide d'installation, exemples de code et détail de chaque module dans la documentation technique.

Ouvrir la documentation →