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.
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.
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.
Autoload
spl_autoload_register, mapping Fennec\ → /fennec, App\ → /src.
Config
Parseur .env.local avec typage automatique des valeurs non citées.
Http
Request et JsonResponse, enveloppe JSON stable succès/erreur.
Container
Injection de dépendances par autowiring Reflection — bind, singleton, instance.
Routing
Attributs PHP 8 #[Route], paramètres dynamiques, cache de routes compilé.
Middleware
Pipeline exécuté autour d'un handler final via des closures imbriquées.
Security
Firewall fail-closed, JWT HS256 maison, RBAC à 4 rôles hiérarchiques.
Database
Wrapper PDO, requêtes exclusivement préparées — jamais de concaténation SQL.
Logger
Journal JSON structuré, un fichier par jour dans var/logs/.
Exception Handling
Handler centralisé au niveau du Kernel, mapping type d'exception → code HTTP.
Console
bin/console et ses commandes natives : route:cache, key:generate...
Documentation
PHPDoc systématique + mini-site généré pour la démonstration portfolio.
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
}
Ce qui fait tourner Fennec
Voir comment c'est construit
Guide d'installation, exemples de code et détail de chaque module dans la documentation technique.
Ouvrir la documentation →