Architecture logicielle multicouche
Se connecter pour s'inscrireVotre progression
Syllabus
-
-
Objectifs
-
Validations de compétences
-
Public cible
Aucun public cible spécifié pour ce module.
-
Besoins techniques
-
Prérequis
- Aucun prérequis
-
Niveau
-
Historique du module
Aucune action enregistrée
Architecture logicielle multicouche
Organiser une application pour que le domaine métier reste indépendant du HTTP, de la base et des détails techniques.
À la fin du cours
- Placer chaque responsabilité dans la couche qui lui appartient.
- Respecter le sens des dépendances et limiter les effets de bord.
- Introduire transactions, repositories et injection de dépendances.
- Tester les règles métier sans démarrer le serveur web.
Organisation
Le cours suit la frontière du domaine, les cas d’usage, la persistance et les tests d’assemblage.
Prérequis : Programmation orientée objet et notions HTTP, SQL et tests.
Comprendre les couches
La couche présentation traduit les requêtes et les réponses. La couche application orchestre les cas d’usage. Le domaine contient les règles qui restent vraies sans framework. L’infrastructure fournit les implémentations techniques.
Une dépendance pointe vers une couche plus stable : le domaine ne connaît ni Doctrine, ni HTTP, ni le fournisseur de messagerie. Cette règle réduit les effets de bord et facilite les migrations.
Présentation → Application → Domaine ← Infrastructure
Modéliser les cas d’usage
Un service applicatif représente une intention utilisateur ou métier. Il charge les objets nécessaires, vérifie les préconditions, applique les règles et renvoie un résultat explicite.
Ne pas placer toutes les requêtes dans un contrôleur : cela rend le cas d_usage difficile à réutiliser et à tester. Inversement, un service ne doit pas exposer directement les entités de persistance comme contrat public.
final class CreateOrderHandler { public function __invoke(CreateOrder $command): OrderResult { /* ... */ } }
Isoler la persistance et les transactions
Le repository traduit les besoins du domaine en requêtes. La transaction commence au plus près du cas d’usage et se termine après l’écriture cohérente de ses données.
Éviter les requêtes N+1, sélectionner uniquement les champs nécessaires et protéger les écritures concurrentes. Un rollback doit laisser la base dans son état initial et être observé dans les tests.
$this->connection->beginTransaction(); try { /* use case */; $this->connection->commit(); } catch (Throwable $e) { $this->connection->rollBack(); throw $e; }
Tester les frontières
Tester les règles métier avec des objets et des doublures simples, puis les repositories avec une base dédiée. Les tests d’intégration vérifient que l’assemblage réel fonctionne.
Documenter les décisions d’architecture avec un diagramme, les dépendances interdites et le sens de migration. Une règle non automatisée finit toujours par être contournée.
Méthode
- Écrire un test du domaine.
- Ajouter un test d’intégration du repository.
- Vérifier la transaction et le contrat HTTP.
Livrables et validation
Le livrable doit montrer une compréhension personnelle, des choix explicités et une vérification par un cas de test ou une procédure reproductible.
- Un diagramme de couches et la matrice des dépendances.
- Un squelette de cas d’usage avec ports et adaptateurs.
- Des tests unitaires et d’intégration documentés.
- Une procédure de migration et de gestion des erreurs.