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

ConceptUtilisation dans ce projet
readonly classClasse Task immuable
Constructor promotionPropriétés Task définies dans le constructeur
enum Priority: stringlow/medium/high avec méthode color()
enum Status: stringtodo/in_progress/done
match()Dispatcher les commandes CLI
Named argumentsCréation de Task lisible
Nullsafe ?->Accès aux données optionnelles
Union typesParamè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

  1. Définir les enums Priority et Status avec méthode label() et color(): string (code ANSI)
  2. Créer la readonly class Task avec id, titre, priorité, statut, createdAt
  3. Créer TaskRepository : load(), save(), add(), findById(), update(), delete()
  4. Créer TaskCli avec méthodes cmdAdd(), cmdList(), cmdUpdate(), cmdDelete()
  5. Dispatcher avec match($command)
  6. Ajouter les couleurs ANSI et le formatage tableau
  7. Ajouter les filtres --status=todo et --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 ANSI
  • php solution.php list --status=todo → filtre fonctionnel
  • php solution.php update 1 --status=done → statut mis à jour
  • php solution.php delete 2 → tâche supprimée
  • Données persistées dans tasks.json entre les exécutions
  • Priority/Status invalides → message d'erreur clair
← Retour au cours 🧠 QCM Module 01 Module 02 →