Objectif
Construire un gestionnaire de tâches en ligne de commande en PHP pur — zéro framework, POO stricte, PHP 8.3.
Critères de réussite : declare(strict_types=1), readonly class Task, Enum Priority/Status, match() dans l'affichage, stockage JSON persistant, couleurs ANSI.
Concepts PHP 8 utilisés
| Concept | Utilisation dans ce projet |
|---|---|
readonly class | Classe Task immuable |
| Constructor promotion | Propriétés Task définies dans le constructeur |
enum Priority: string | low/medium/high avec méthode color() |
enum Status: string | todo/in_progress/done |
match() | Dispatcher les commandes CLI |
| Named arguments | Création de Task lisible |
Nullsafe ?-> | Accès aux données optionnelles |
| Union types | Paramètres acceptant int|string |
Structure
01-php-moderne/mini-projet/
├── solution.php ← Solution complète (1 fichier)
└── tasks.json ← Données persistées (auto-créé)
Architecture interne
<?php
declare(strict_types=1);
// Enums
enum Priority: string { case Low='low'; case Medium='medium'; case High='high'; }
enum Status: string { case Todo='todo'; case InProgress='in_progress'; case Done='done'; }
// Value Object immuable
readonly class Task { ... }
// Repository (persistance JSON)
class TaskRepository { ... }
// CLI Application
class TaskCli { ... }
// Point d'entrée
(new TaskCli(new TaskRepository('tasks.json')))->run($argv);
Étapes de développement
- Définir les enums
PriorityetStatusavec méthodelabel()etcolor(): string(code ANSI) - Créer la
readonly class Taskavec id, titre, priorité, statut, createdAt - Créer
TaskRepository:load(),save(),add(),findById(),update(),delete() - Créer
TaskCliavec méthodescmdAdd(),cmdList(),cmdUpdate(),cmdDelete() - Dispatcher avec
match($command) - Ajouter les couleurs ANSI et le formatage tableau
- Ajouter les filtres
--status=todoet--priority=high
Interface CLI
# Ajouter une tâche
php solution.php add "Apprendre Laravel" --priority=high
# Lister toutes les tâches
php solution.php list
# Filtrer
php solution.php list --status=todo
php solution.php list --priority=high
# Mettre à jour le statut
php solution.php update 1 --status=in_progress
# Mettre à jour la priorité
php solution.php update 1 --priority=medium
# Supprimer
php solution.php delete 1
# Aide
php solution.php help
Affichage attendu
┌────┬──────────────────────────────┬──────────┬────────────┬─────────────┐
│ ID │ Titre │ Priorité │ Statut │ Créé le │
├────┼──────────────────────────────┼──────────┼────────────┼─────────────┤
│ 1 │ Apprendre Laravel │ 🔴 High │ ⬜ Todo │ 2024-01-15 │
│ 2 │ Créer un API REST │ 🟡 Med │ 🔵 En cours│ 2024-01-16 │
│ 3 │ Écrire les tests │ 🟢 Low │ ✅ Terminé │ 2024-01-17 │
└────┴──────────────────────────────┴──────────┴────────────┴─────────────┘
3 tâche(s) affichée(s)
Critères de validation
php solution.php add "Ma tâche" --priority=high→ tâche créée, ID affichéphp solution.php list→ tableau formaté avec couleurs ANSIphp solution.php list --status=todo→ filtre fonctionnelphp solution.php update 1 --status=done→ statut mis à jourphp solution.php delete 2→ tâche supprimée- Données persistées dans
tasks.jsonentre les exécutions - Priority/Status invalides → message d'erreur clair