Les Design Patterns - Partie 1 : MVC§
- Réponses à des problématiques de conception récurrentes
- Ensemble de bonne pratiques
Note
Framework : Ensemble de composants qui servent à créer les fondations, l'architecture et les grandes lignes d'un logiciel
Source : OpenClassrooms
Source : Documentation Symfony 1.4
Logique métier
C'est la problématique traitement/calcul
Elle contient aussi tout ce qui concerne l'accès aux données
C'est là qu'on trouvera les requêtes SQL
En Web, on utilise souvent la notion d' ORM : Object Relational Mapper
Il s'agit de mapper les tables SQL avec des classes de deux types :
getById($id)
pour créer un objet DTO et remplir ses attributs à partir de la base, grâce à une requête SQL (on appelle ça "hydrater" le DTO)persist($dto)
pour sauvegarder un nouveau DTO en base (puis penser à hydrater son ID, voir PDO::lastInsertId())update($dto)
pour enregistrer en base les modifications faites sur un DTO existant (hydraté)delete($dto)
pour supprimer de la base un DTO existant (hydraté)$_SERVER['REQUEST_URI']
<?=
et ?>
<?php if (cond): ?>
, <?php elseif (cond): ?>
, <?php else: ?>
, et <?php endif ?>
<?php foreach ($collection as $item): ?>
et <?php endforeach ?>
Transformer son code en une architecture MVC Maison
Arborescence à respecter : 3 répertoires "Model", "View", "Controller" ; un index.php qui sert de FrontController, et un répertoire "Library" pour stocker les bibliothèques additionnelles si nécessaire.
- Film (représentation d'un film de la table Film)
- FilmRepository (contient les méthodes d'hydratation, persistence, mise à jour, suppression)
- Actor
- ActorRepository
- Casting
- CastingRepository
- DBConnectionManager
Exemple de Repositories
FilmRepository - bdd : PDO + getById(int) : Film + getByYear(int) : Film[] + persist(Film) + update(Film) + delete(Film) + getFilmsWith(Actor) : Film[]
NB : getFilmsWith(Actor) fera une jointure sur Casting. En effet un Repository a le droit de requêter une table en rapport avec sa table "de prédilection"
ActorRepository - bdd : PDO ... même modèle que pour Film + getActorsIn(Film) : Actor[]
Idem : getActorsIn(Film) fera une jointure sur Casting.
CastingRepository - bdd : PDO + getBy(Actor, Film) : Casting + persist(Casting) + update(Casting) + delete(Casting)
- Créer un fichier layout.php (à placer dans le dossier View) contenant tous les éléments communs des vues. Il constue donc un modèle de page (template). Il permet également d'ajouter les éléments spécifiques à chaque vue à l'aide de deux variables $title et $content (la variable $content pourra etre remplie grace à la bufferisation de sortie)
<!DOCTYPE html> <html lang="fr"> <head> <title><?= $title ?></title> </head> <body> <?= $content ?> </body> </html>
- Les éléments communs de votre design (menu, boutons, formulaires) devront également etre rajoutés (ou inclus) dans cette page
- Sans paramètres, le FrontController
index.php
enverra vers un sous-contrôleur par défaut qui listera tous les films.
- La page /detailFilm?id=<ID> devra permettre d'afficher les informations relatives à film, ainsi que son casting, avec les acteurs ordonnés par rang de casting en conservant la charte graphique adoptée.
- Le FrontController doit regarder l'URL et dispatcher vers le contrôleur de detailFilm
- Modifier l'affichage des films pour y rajouter pour chacun un lien vers le détail de ce film
- Inclure un lien accueil pour retourner à la liste des films