Patrons architecturaux PHP : de MVC à CQRS

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi l'architecture fait toute la différence (et votre café ne refroidira plus)

\n

Imaginez que vous construisez une maison. Vous pouvez empiler les briques n'importe comment, les coller avec du chewing-gum et espérer qu'elle tienne jusqu'à l'hiver. Ou alors, vous pouvez concevoir des fondations, des murs et un toit solides pour qu'elle résiste à la fois à une tempête et à une invasion de beaux-parents. Dans le monde PHP, c'est exactement pareil. Les patrons architecturaux sont ces plans qui transforment votre code de « ça marche, c'est déjà ça » en « ça marche, ça s'adapte et ça ne donne pas envie de tout jeter par la fenêtre ».

\n

Quand j'ai commencé à coder en PHP, mes projets étaient des monstres monolithiques. Dans un seul fichier index.php cohabitaient des requêtes SQL, du HTML et de la logique métier. Ça fonctionnait jusqu'au moment où le client demandait une nouvelle fonctionnalité. Ensuite, c'était l'enfer. Aujourd'hui, je vais vous montrer comment éviter cet enfer. Nous allons passer en revue les patrons architecturaux clés en PHP, des classiques aux approches modernes. C'est parti !

\n\n

MVC (Modèle-Vue-Contrôleur) : le grand-père de tous les patrons

\n

Si vous avez déjà codé avec Laravel, Symfony ou Yii2, vous avez rencontré le MVC. C'est le patron architectural de base en PHP qui divise l'application en trois parties :

\n
    \n
  • Modèle — les données et la logique métier (accès à la BDD, validation, calculs).
  • \n
  • Vue — l'affichage (HTML, templates, JSON).
  • \n
  • Contrôleur — l'intermédiaire : il reçoit la requête, appelle le Modèle et transmet les données à la Vue.
  • \n
\n

Le MVC résout le problème principal : la séparation des responsabilités. Fini le SQL dans le HTML. Le code devient lisible, testable et maintenable.

\n\n

Exemple MVC en PHP pur

\n
// Modèle : User.php\nclass User {\n    public function find(int $id): ?array {\n        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n        $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n        $stmt->execute([$id]);\n        return $stmt->fetch() ?: null;\n    }\n}\n\n// Contrôleur : UserController.php\nclass UserController {\n    public function show(int $id): void {\n        $userModel = new User();\n        $user = $userModel->find($id);\n        if (!$user) {\n            http_response_code(404);\n            echo 'Utilisateur introuvable';\n            return;\n        }\n        // Transmission des données à la Vue\n        require 'views/user.php';\n    }\n}\n\n// Vue : views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>Email : <?= htmlspecialchars($user['email']) ?></p>
\n

Quand l'utiliser : pour des applications web de complexité moyenne. Si vous avez un simple blog ou une boutique en ligne, le MVC est fait pour vous. Mais attention : si les contrôleurs deviennent trop gros (Fat Controllers), le patron perd tout son sens.

\n\n

Active Record : simplicité et rapidité

\n

Le patron Active Record fait en sorte qu'un objet représente à la fois une ligne en BDD et la logique métier. Vous vous souvenez de Laravel Eloquent ou Yii2 ActiveRecord ? C'est exactement ça. Chaque modèle est à la fois une requête à la base, des règles de validation et des relations.

\n\n

Exemple Active Record (style Eloquent)

\n
class User extends ActiveRecord {\n    // Les propriétés correspondent aux colonnes de la table\n    public int $id;\n    public string $name;\n    public string $email;\n\n    public function save(): bool {\n        // Logique INSERT/UPDATE\n        if ($this->id) {\n            // UPDATE\n        } else {\n            // INSERT\n        }\n        return true;\n    }\n\n    public static function find(int $id): ?self {\n        // SELECT * FROM users WHERE id = $id\n    }\n}\n\n// Utilisation\n$user = new User();\n$user->name = 'Jean';\n$user->email = 'jean@example.com';\n$user->save(); // Simple et clair
\n

Avantages : écriture rapide, intuitif pour les débutants. Inconvénients : viole le principe de responsabilité unique (Single Responsibility de SOLID). Le modèle connaît à la fois les données et la manière de les sauvegarder. Pour des projets complexes, cela peut devenir un frein.

Blogs

Book Recommendations