Académique Documents
Professionnel Documents
Culture Documents
1. Présentation...............................................................................................................................................
1
2. Introduction................................................................................................................................................
3. Création de la base de données................................................................................................................
4. Modèle sans MVC.......................................................................................................................................
4.1. Critique du modèle sans MVC..............................................................................................................
5. Modèle MVC................................................................................................................................................
5.1. Une logique métier...............................................................................................................................
5.2. Présentation du modèle MVC...............................................................................................................
5.3. Rôles des composants.........................................................................................................................
5.4. Interactions entre les composants........................................................................................................
5.5. Mise en place de l’architecture MVC dans l’exemple...........................................................................
5.6. Avantages............................................................................................................................................
Figure 6 : Fichier Modele.php......................................................................................................................
6. Améliorations MVC....................................................................................................................................
6.1. Factorisation des éléments d'affichage................................................................................................
6.2. Application à l’exemple.........................................................................................................................
6.2.1. Principe du modèle de page........................................................................................................
6.2.1. Les fonctions ob_start() et ob_get_clean()..................................................................................
6.3. Factorisation de la connexion à la base de données...........................................................................
6.4. Sous partie controleur : Gestion des erreurs........................................................................................
6.4.1. Modifier le comportement de l’objet PDO....................................................................................
6.4.2. Try-catch.....................................................................................................................................
6.4. Une présentation cohérente à l'utilisateur............................................................................................
6.5. Autres améliorations.............................................................................................................................
6.5.1. La fonction prepare().........................................................................................................................
6.5.1.1. Un outil de sécurité contre l’injection SQL................................................................................
7. Modèle POO................................................................................................................................................
7.1. Passage à un ‘Modele’ orienté objet....................................................................................................
7.2. Technique de “lazy loading” dans notre Modèle:................................................................................
7.3. Passage à une Vue orientée objet.......................................................................................................
7.3.1 Logigramme de Vue.....................................................................................................................
7.4. Passage à un Contrôleur orienté objet.................................................................................................
7.4.1 Contrôleur frontal de index.php vers une classe...........................................................................
7.5. Testons notre blogue............................................................................................................................
7.6. Ajoutons une fonctionnalité..................................................................................................................
7.7. Teste de la fonctionnalité.....................................................................................................................
7.8. Notre architecture finale.......................................................................................................................
Bibliographie...............................................................................................................................................
2
1. Présentation
Ce rapport a pour objectif de présenter la mise en place d'une architecture MVC en
PHP pour un blog contenant des articles. L'architecture MVC est une méthode de
conception logicielle largement utilisée pour développer des applications Web en
utilisant le langage de programmation PHP. Elle permet une séparation claire des
responsabilités entre les différentes parties d'une application et offre une meilleure
maintenabilité, évolutivité et extensibilité.
2. Introduction
Le développement d'une application Web en utilisant le langage de programmation
PHP peut être une tâche complexe, surtout lorsque l'application est volumineuse et
que les différentes parties de l'application sont interdépendantes. L'architecture
MVC (Modèle-Vue-Contrôleur) en PHP a été créée pour résoudre ce problème en
séparant clairement les responsabilités des différentes parties de l'application.
Dans ce rapport, nous allons présenter la mise en place d'une architecture MVC en
PHP pour un blog contenant des articles. Le modèle représentera les données du
blog, la vue sera responsable de la présentation des articles aux visiteurs, et le
contrôleur gérera la communication entre le modèle et la vue en utilisant le langage
de programmation PHP.
4
4.1. Critique du modèle sans MVC
Le code présenté est un code PHP utilisant une connexion directe à la base de
données pour récupérer des données et les afficher sur une page web. Il n'utilise
pas l'architecture MVC (Modèle-Vue-Contrôleur) qui est une approche de conception
de logiciels permettant de séparer la logique métier de la présentation.
Le principal problème de ce modèle est qu'il n'y a pas de séparation claire des
responsabilités. La logique métier et la présentation sont toutes deux intégrées dans
le code PHP, ce qui peut rendre le code difficile à maintenir et à évoluer à mesure
que les exigences du projet évoluent.
5. Modèle MVC
5.1. Une logique métier
La logique métier est l'ensemble des règles, procédures et calculs spécifiques à une
entreprise ou une organisation qui sont nécessaires pour accomplir ses activités
principales et atteindre ses objectifs. Elle est souvent formalisée dans des
documents tels que des manuels ou des cahiers des charges et est utilisée pour
guider le développement de logiciels ou de systèmes informatiques qui automatisent
ou soutiennent les processus métier. Dans le modèle MVC, la logique métier est une
partie importante du modèle, car il est responsable de la gestion des données et de
la logique métier de l'application.
6
5.3. Rôles des composants
La partie Modèle d'une architecture MVC encapsule la logique métier ainsi que
l'accès aux données.
Il peut s'agir d'un ensemble de fonctions (Modèle procédural) ou de classes (Modèle
orienté objet).
La partie Vue s'occupe des interactions avec l'utilisateur : présentation, saisie et
validation des données.
La partie Contrôleur gère la dynamique de l'application. Elle fait le lien entre
l'utilisateur et le reste de l'application.
7
du blog, et un fichier "index.php" qui va faire le lien entre les deux pages
précédentes.
Cette approche de la programmation est appelée "architecture MVC" (Modèle - Vue
- Contrôleur). Elle consiste à séparer le code en trois parties distinctes :
❖ Le Modèle, qui gère l'accès aux données et la logique métier de l'application
❖ La Vue, qui gère l'affichage des données à l'utilisateur
❖ Le Contrôleur, qui fait le lien entre le Modèle et la Vue, et qui gère les actions
de l'utilisateur (comme l'envoi d'un formulaire, par exemple).
Cette approche permet de faciliter la maintenance du code, de le rendre plus lisible
et plus facile à comprendre, et de le rendre plus facilement évolutif.
index.php
index.php
Modele.php
vueAccueil.php
5.6. Avantages
le design pattern MVC (Modèle-Vue-Contrôleur) est conçu pour répondre aux
principes suivants:
8
faciliter la maintenance du code, de rendre le code plus réutilisable et de le
rendre plus facilement testable.
● Le principe de "cohésion forte" indique que les éléments d'un module ou d'une
classe doivent être étroitement liés et contribuer à la même fonctionnalité.
Cela signifie que les éléments qui ne sont pas directement liés à la fonction
principale de la classe ou du module doivent être déplacés ailleurs. Une forte
cohésion facilite la compréhension et la modification du code, et réduit le
risque d'erreurs.
9
Figure 6 : Fichier Modele.php
6. Améliorations MVC
6.1. Factorisation des éléments d'affichage
La factorisation des éléments d'affichage communs est une technique qui consiste à
regrouper les éléments d'affichage qui sont utilisés dans plusieurs parties d'une
application et à les placer dans un fichier ou une classe distincte. Cela permet de
réduire la duplication de code et de faciliter la maintenance.
Par exemple, si une application web a plusieurs pages qui utilisent le même en-tête
et le même pied de page, il peut être utile de créer un fichier distinct pour ces
éléments d'affichage et de les inclure dans chaque page. De cette façon, si l'on doit
apporter des modifications à l'en-tête ou au pied de page, il suffit de le faire une
seule fois dans le fichier distinct plutôt que de le modifier sur chaque page.
La factorisation des éléments d'affichage communs peut également s'appliquer à
d'autres parties de l'application, comme les formulaires, les boutons, les messages
d'erreur, etc. En regroupant ces éléments dans des fichiers ou des classes
10
distinctes, on peut améliorer la cohérence de l'interface utilisateur et faciliter la
maintenance du code.
En résumé, la factorisation des éléments d'affichage communs est une technique
qui permet de réduire la duplication de code et de faciliter la maintenance en
regroupant les éléments d'affichage communs dans des fichiers ou des classes
distinctes.
11
vueAccueil.php
vueAcuceil.php
gabarit.php
Partie statique
Partie dynamique
$titre $conten
u
Dans la plupart des sites web dynamiques, le titre de la page est souvent généré
dynamiquement en fonction de la page affichée ou des données qui y sont
présentées.
Le titre de la page est donc dynamisé pour permettre de l'adapter à chaque page
affichée. Cela se fait en utilisant une variable $titre qui contient le titre spécifique de
chaque page et qui est insérée dans la balise <title> du template à l'aide de la
fonction echo.
12
6.2.1. Les fonctions ob_start() et ob_get_clean()
● La fonction ob_start() est utilisée pour activer la temporisation de sortie
(output buffering) dans le but de stocker temporairement les données
envoyées à la sortie (comme les résultats de la requête SQL) dans une
mémoire tampon, avant de les envoyer au navigateur.
13
les répéter sur chaque page. Une fois les éléments communs ajoutés, la
mémoire tampon est vidée et le contenu spécifique de chaque page est
ajouté à la suite.
● La fonction ob_get_clean() est une fonction PHP qui permet de récupérer le
contenu de la mémoire tampon de sortie (output buffer en anglais), de vider la
mémoire tampon et de désactiver la mise en tampon de la sortie.
Page générée
du script ob_start()
stockage
Mémoire tampon
ob_get_clean()
vide la mémoire
tampon et
Page générée récupère la
du script page générée.
Utilisée
Page 1 Page 3
Page 2
Sans l'utilisation de la fonction ob_start(), la factorisation des éléments d'affichage
communs ne fonctionnerait pas car les éléments inclus avec la fonction include
seraient affichés directement à l'écran au lieu d'être stockés dans une variable.
L'utilisation de la fonction ob_start() permet de mettre en tampon la sortie de PHP
avant de l'afficher à l'écran. Ainsi, les éléments inclus avec la fonction include sont
stockés dans une variable plutôt que d'être affichés directement à l'écran, ce qui
permet de les manipuler avant de les afficher ou de les stocker dans une variable.
14
une classe distincte afin de réduire la duplication de code et de faciliter la
maintenance.
15
La valeur par défaut de l'attribut PDO::ATTR_ERRMODE est
PDO::ERRMODE_SILENT, ce qui signifie que les erreurs sont silencieuses et ne
sont pas signalées par PDO.
6.4.2. Try-catch
❖ Le bloc "try" contient le code qui doit être exécuté et qui peut lever une
exception. Si une exception est levée, le code est interrompu et l'exécution
passe au premier bloc "catch" correspondant à l'exception levée.
❖ Le bloc "throw" permet de lever une exception en créant un objet de type
"Exception" ou une sous-classe de cette dernière, avec des informations sur
l'erreur rencontrée.
❖ Le bloc "catch" permet de capturer l'exception et de gérer l'erreur. Il peut y
avoir plusieurs blocs "catch" pour gérer différentes exceptions.
❖ L'objet "Exception" contient des informations sur l'erreur levée, comme son
message, son code d'erreur et sa trace d'exécution. Ces informations sont
accessibles dans le bloc "catch" via l'objet "Exception" passé en argument.
16
17
6.4. Une présentation cohérente à l'utilisateur
Dans le cadre d'une application web, il est important de toujours maintenir une
présentation cohérente à l'utilisateur, même en cas d'erreur. Pour cela, il est courant
de créer une vue dédiée à l'affichage des erreurs, par exemple nommée
"vueErreur.php".
Cette vue peut contenir des informations sur l'erreur survenue (message d'erreur,
code d'erreur, etc.) et permettre à l'utilisateur de revenir à la page précédente ou à
l'accueil du site.
18
données, puis ajouter une page contrôleur pour lier le modèle et la vue. Pour rendre
le contexte d'exemple plus réaliste, le clic sur le titre d'un billet de blog doit
désormais afficher sur une nouvelle page le contenu et les commentaires associés à
ce billet. Pour répondre à ce nouveau besoin, le modèle et la vue nécessaires sont
ajoutés, et un nouveau fichier contrôleur est créé. La vue de la page d'accueil est
également modifiée pour ajouter un lien vers la page billet.php. Le résultat obtenu
est une présentation harmonieuse.
19
considérées comme des données et non comme des instructions SQL, et ne sont
pas interprétées par le serveur de base de données comme telles. Cela empêche
les attaques par injection SQL car même si un attaquant essaie d'insérer des
instructions SQL malveillantes dans les valeurs fournies, ces instructions ne seront
pas interprétées par le serveur de base de données.
7. Modèle POO
Rappelons qu’on a un modèle et un contrôleur, on souhaite les écrire en modèle
POO.
20
On peut facilement créer des classes métier modélisant pour modéliser les entités
21
7.1. Passage à un ‘Modele’ orienté objet
22
7.2. Technique de “lazy loading” dans notre Modèle:
Dans notre modèle, nous avons utilisé la technique du chargement tardif pour
retarder l'instanciation de l'objet qui gère l'accès à la base de données. Plus
précisément, nous avons utilisé une variable de classe nommée "$bdd" qui est
initialisée à NULL lors de la création de l'objet et qui est instanciée à la première
utilisation de la méthode "getBdd()".
La méthode "getBdd()" est utilisée pour accéder à l'objet qui gère l'accès à la base
de données. Lorsqu'elle est appelée, la méthode vérifie si l'objet "$bdd" a déjà été
instancié. Si ce n'est pas le cas, la méthode instancie un nouvel objet PDO, qui est
ensuite assigné à la variable "$bdd".
Cette technique permet de retarder l'instanciation de l'objet PDO jusqu'à ce qu'il soit
réellement nécessaire, c'est-à-dire jusqu'à ce qu'une requête SQL soit exécutée.
Cela peut améliorer les performances de l'application en évitant de charger toutes
les données associées à une entité donnée lorsqu'elle est chargée pour la première
fois.
l'abstraction a été un élément clé pour la mise en place de la technologie lazy
loading dans notre modèle. Elle nous a permis de masquer les détails
23
d'implémentation de l'accès à la base de données en fournissant une interface de
haut niveau pour les classes métiers, tout en mettant en place la technique du
chargement tardif pour économiser des ressources système et améliorer les
performances de l'application. La méthode abstraite "getBdd()" a été utilisée pour
retarder l'instanciation de l'objet PDO jusqu'à ce qu'il soit réellement nécessaire. En
utilisant l'abstraction, nous avons pu rendre notre modèle plus modulaire, plus facile
à maintenir et plus évolutif.
24
25
26
● Solution:
Maintenant qu’on a identifié ces problèmes, il est possible de proposer une
solution. La solution consiste à utiliser une classe Vue qui encapsule la
génération des fichiers vue et l'utilisation des fonctions ob_start et
ob_get_clean. La classe Vue peut également inclure des protections
contre les erreurs de chargement de fichiers vue, ainsi que d'autres
fonctionnalités utiles pour la gestion des vues dans l'application.
27
28
La classe Vue est une solution qui permet de résoudre les deux problèmes
précédemment mentionnés. Elle offre une encapsulation de la génération des
fichiers vue et gère la temporisation de sortie avec ob_start() et ob_get_clean().
Elle prend en compte également la protection contre l'absence du fichier demandé,
en levant une exception si le fichier n'existe pas.
La classe Vue a une méthode constructeur qui prend en paramètre l'action, qui
détermine le nom du fichier vue à utiliser. Elle a également une méthode generer()
qui génère et affiche la vue, en utilisant la méthode genererFichier() qui génère le
contenu de la vue en utilisant les données passées en paramètre.
La méthode genererFichier() utilise la fonction file_exists() pour vérifier si le fichier
demandé existe et lance une exception s'il n'existe pas. Elle utilise également
ob_start() pour démarrer la temporisation de sortie, et ob_get_clean() pour
renvoyer le tampon de sortie généré par l'inclusion du fichier vue.
En utilisant cette classe, on évite la duplication des appels aux fonctions ob_start()
et ob_get_clean() et on protège contre les erreurs d'absence de fichier demandé.
29
La deuxième instance étape consiste pour chaque vue à définir la variable $this-
>titre qui sera utilisée dans le gabarit pour afficher le titre de la page
correspondante. De plus, il faut supprimer les appels aux fonctions PHP de
temporisation.
30
31
32
7.4. Passage à un Contrôleur orienté objet
Notre partie Contrôleur actuelle se compose d'une série d'actions écrites sous la forme de
fonctions et du contrôleur frontal index.php.
33
34
Chaque classe contrôleur instancie les classes modèle requises, puis utilise leurs
méthodes pour récupérer les données nécessaires aux vues. La méthode generer
de la classe Vue définie plus haut est utilisée en lui passant en paramètre un tableau
associatif contenant l'ensemble des données nécessaires à la génération de la vue.
Chaque élément de ce tableau est constitué d'une clé (entre apostrophes) et de la
valeur associée à cette clé.
35
● Ce code définit une classe Routeur qui permet de gérer les différentes
requêtes entrantes (requêtes HTTP envoyées au serveur par le client
(navigateur web) pour demander une ressource ou une action).
● Les trois premières lignes font appel aux fichiers ControleurAccueil.php,
ControleurBillet.php et Vue.php, qui contiennent les classes
ContrôleurAccueil, ContrôleurBillet et Vue, respectivement. Ces fichiers
doivent être inclus pour pouvoir utiliser ces classes.
● La classe Routeur contient deux propriétés privées : $ctrlAccueil et $ctrlBillet,
qui sont des instances de ControleurAccueil et de ControleurBillet,
respectivement. Ces propriétés sont initialisées dans le constructeur de la
classe.
● La méthode publique routerRequete() analyse la requête entrante et
détermine l'action à entreprendre en fonction des paramètres de la requête
GET. Si l'action est "billet", elle appelle la méthode billet() de l'objet $ctrlBillet,
qui prend en paramètre l'identifiant du billet à afficher. Sinon, si aucune action
n'est définie, elle appelle la méthode accueil() de l'objet $ctrlAccueil, qui
affiche la page d'accueil du site. Si l'action n'est pas valide, elle génère une
exception avec le message "Action non valide".
● La méthode privée erreur() permet d'afficher une vue spécifique en cas
d'erreur. Elle crée un objet Vue avec le titre "Erreur" et appelle la méthode
generer() de cet objet en lui passant un tableau associatif contenant le
message d'erreur.
● En résumé, cette classe Routeur permet de gérer les différentes requêtes
entrantes en redirigeant vers les contrôleurs correspondants, qui utiliseront
les classes Modèle et Vue pour générer la réponse appropriée. Cela permet
une meilleure organisation du code et facilite la maintenance du site web.
36
7.6. Ajoutons une fonctionnalité.
Avec cette nouvelle architecture, l'ajout de nouvelles fonctionnalités est plus simple
et modulaire, car chaque fonctionnalité est gérée par son propre contrôleur et sa
propre vue.
On souhaite maintenant que l'affichage des détails sur un billet permettra d'ajouter
un nouveau commentaire. Le remplissage des champs Auteur et Commentaire est
obligatoire. Le clic sur le bouton Commenter déclenche l'insertion du commentaire
dans la base de données et la réactualisation de la page Web.
les étapes en résumé pour ajouter la fonctionnalité d'ajout de commentaire :
1. Ajouter une méthode dans la classe Commentaire permettant d'insérer un
nouveau commentaire dans la base de données.
2. Ajouter un formulaire HTML dans la vue d'un billet pour permettre la saisie
d'un nouveau commentaire.
3. Ajouter une méthode dans le contrôleur Billet pour traiter l'action de
soumission du formulaire et appeler le service du modèle pour insérer le
commentaire dans la base de données.
4. Mettre à jour le routeur pour router une requête d'ajout de commentaire vers
la nouvelle méthode du contrôleur.
37
38
7.7. Teste de la fonctionnalité.
39
Pour corriger cette erreur:
40
Le commentaire est bien affiché sur le site et ajouté à la base de données
41
7.8. Notre architecture finale
Bibliographie
https://kamechnoue.wordpress.com
43
https://bpesquet.developpez.com/tutoriels/php/evoluer-architecture-mvc/#LI
https://github.com/bpesquet/MonBlog
44