Étude de cas · 2026
Plateforme E-Learning
Plateforme e-learning full-stack Laravel + Vue 3 avec rôles admin/enseignant/étudiant, modules/leçons, quiz, certificats et suivi de progression.
Laravel 10Vue 3 (Composition API + Pinia)ViteMySQLRedisDockerSanctum (HttpOnly cookies + CSRF)PHPUnitVitestGitHub Actions

3Rôles : admin, enseignant, étudiant
200 MoTaille max. d'un fichier de leçon
0–100Seuil de réussite des quiz configurable
DockerEnvironnement de dev et de déploiement reproductible
01
Le défi
- Problème Les étudiants apprenaient passivement sans explications claires. Il fallait un système où ils peuvent apprendre à leur rythme, choisir des matières, être évalués et obtenir des certificats.
- Contraintes Développement solo, apprentissage de Laravel et Docker, hébergement local instable (XAMPP), délai serré avant la présentation, budget nul.
- Principal obstacle Séparation RBAC complexe entre admin, formateur et apprenant. XAMPP est tombé en panne le jour de la présentation.
- Cause Modélisation des rôles complexe ; Apache/MySQL de XAMPP instable.
- Solution immédiate Refactorisation de la logique des rôles, régénération des clés, restructuration du schéma BD et migration vers MySQL sur WAMP.
02
L'approche
- RBAC Gates/Middleware Laravel (can:apprenant, can:manage-courses, can:admin) + gardes de navigation Vue Router.
- Architecture API-first Laravel + SPA Vue 3 (Composition API + Pinia + Vite), authentification Sanctum (cookies HttpOnly + CSRF, pas de JWT dans localStorage).
- Entités Cours, Module, Lecon, Quiz, Question, TentativeQuiz, Inscription; leçons terminées (lecons_terminees); soft deletes, is_active, role sur User.
- Évaluation Soumission transactionnelle, scoring (insensible à casse, espaces ignorés), pourcentage vs scoreMinimal (0–100, défaut 50, seed 60–70). Stocke TentativeQuiz (score, reussi, reponses). Réponses correctes masquées via makeHidden('bonneReponse'); contrôle d'accès selon rôle/propriété/inscription.
- Sécurité Rate-limiting (quiz 10/5min, login 5/min, register 10/h).
- Fichiers Upload de leçons (PDF, vidéo, image) jusqu'à 200MB.
- Performance/Qualité Eager loading pour éviter N+1, Redis stats admin, pagination, export CSV par chunks, tests PHPUnit, Vitest, Pint/ESLint, CI GitHub Actions.
- Infra Docker (Apache+PHP-FPM, Nginx, MySQL 8, Redis 7, phpMyAdmin opt.), déployé via AlwaysData + Docker; passage de XAMPP à WAMP.
Impact
Apprécié par l'enseignant et le jury pour son adéquation aux besoins réels ; certificat délivré à la fin du parcours.
03
Captures d'écran

04
Ce que je ferais différemment
- Le stack Apache/MySQL de XAMPP est tombé en panne le jour de la présentation. La prochaine fois, je conteneuriserais dès le premier commit — Docker a rendu l'environnement reproductible, mais je ne l'ai adopté que tard.
- La séparation des permissions admin / enseignant / étudiant s'est emmêlée parce que je l'ai modélisée en construisant. J'écrirais désormais la matrice des rôles et les policies avant le premier contrôleur.
- J'ai appris Laravel et Docker de zéro avec une échéance serrée. Je prévoirais une phase d'exploration pour les outils inconnus plutôt que de les apprendre pendant le développement.