Un exemple élémentaire d'application MVC en PHP

KristenLeLiboux 58,178 views 26 slides Jul 20, 2013
Slide 1
Slide 1 of 26
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26

About This Presentation

Construire une application sur l'architecture modèle-vue-contrôleur en PHP à partir d'un exemple simple : une liste de choses à faire, avec deux pages types : liste et détails.


Slide Content

UN EXEMPLE ÉLÉMENTAIRE
D’APPLICATION MVC EN PHP
KRISTEN LE LIBOUX
JUILLET 2013

Introduction

Une liste de choses à faireDeux pages-types :
•Page d’accueil (liste des choses, cliquables)
•Détails d’une chose (nom, à faire avant le...)
3

Objectif
Concevoir une architecture pour ce site élémentaire
•Générique, réutilisable, extensible
•Avec le modèle de conception MVC :
Modèle - Vue - Contrôleur
•Et avec URL rewriting
4

Mockups : liste
5
TODO.COM
copyright...
A faire :
•Ranger les courses
•Faire le ménage
•Dormir
http://localhost/todolist

Mockups : détails
6
TODO.COM
copyright...
Ranger les courses :
A faire avant le
17/01/2013 11:00:00
Retour
http://localhost/todolist/item/ranger-courses
http://localhost/todolist/item.php?id=1

Rappels sur MVC

Modèle MVC
Principe de conception d’applications
basé sur la séparation de 3 fonctions essentielles
en composants distincts :
•Modèle : gérer les données
•Vue : gérer l’affichage, l’UI
•Contrôleur : agir
8

Modèle MVC en PHP
Modèle :
•Gère les échanges avec la BDD
•Une classe par entité de la BDD
(utilisateur, article, catégorie, produit, etc...)
•On peut utiliser un ORM (Doctrine, Propel) pour cela
9

Modèle MVC en PHP
Vue :
•Affichages HTML (parfois JSON si Ajax)
•On injecte des parties variables (provenant du
modèle par exemple) : détails d’un article, d’un
produit, etc
•On peut utiliser un moteur de templates
(Smarty, Twig)
10

Modèle MVC en PHP
Contrôleur :
•Implémente les actions
•Autant de classes que nécessaires, regroupées par
entités logiques (Articles, Utilisateurs, Produits,
Commande, etc...)
•Et aussi pour les erreurs (404, 403...)
•Chaque contrôleur a ses actions (lister, afficher,
insérer, éditer, supprimer, etc)
•Chaque contrôleur a ses vues associées
11

Modèle MVC en PHP
Noyau (kernel) : le chef d’orchestre
•Analyse la requête du client
•Instancie le contrôleur correspondant
•Exécute l’action
•Affiche la vue, etc.
12

Modèle MVC en PHP
Point d’entrée du site (unique, index.php) :
•Premier script appelé, quelle que soit la requête
•Initialise la configuration
•Appelle le noyau
Impose de configurer Apache, URL rewriting
13

Schéma récapitulatif (1/4)
Supposons que le client (internaute) appelle l’URL :
http://localhost/todolist/item/ranger-courses
•Il s’agit de l’URL de la page
« détails de l’élément "Ranger les courses" »
•Observons le processus côté serveur.
14

index.php?query=item/ranger-courses
point
d’entrée
Kernel::run()
$cont = new ItemController
! ! ! !("ranger-courses");
$cont->display();
noyau
contrôleur
et action
modèle
Item::find("ranger-courses");
$view = new View("item-details.html");
echo $view->render();
vue
client
http://localhost/todolist/item/ranger-courses
réécriture

Schéma récapitulatif (3/4)
1.Le client requiert une URL http://.../item/ranger-courses
2.Redirection Apache vers index.php?query=item/ranger-courses
3.Exécution de index.php (point d’entrée unique) :
3.1.Initialisation de la configuration (ROOT, HOME)
3.2.Inclusion de «kernel.php» (classe statique)
3.3.Exécution du noyau avec Kernel::run()
16

Schéma récapitulatif (4/4)
3.3.1!!Le noyau analyse la requête (fait appel à un routeur) :
! ! !Contrôleur : !ItemController
! ! !Action : !! !display
! ! !Paramètres : !slug = " ranger-courses"
3.3.2!!Le noyau instancie ce contrôleur, lui passe les
! ! !paramètres et exécute l’action :
! ! !- Instanciation du modèle nécessaire (Item)
! ! !- Recherche de l’élément correspondant au slug
! ! !- Génération de la vue et envoi au client
17

Pourquoi une telle complexité ?
Modularité
•Facilite la coopération de différents développeurs
•Les fichiers HTML sont le moins modifiés possible par
rapport aux livraisons de l’intégrateur
Fiabilité et maintenabilité
•Chaque classe fait peu de choses, mais le fait parfaitement
•Ou sinon, c’est facile de localiser les erreurs
•Le code est factorisé, jamais dupliqué
Extensibilité
•Ajouter une action ou une fonctionnalité entière est facile
18

Architecture des
répertoires

www/
•.htaccess
•index.php
•css, images, js, etc
(aucun ici...)
Répertoires et fichiers à créer
app/
•kernel/
•controller/
•model/
•view/
20

app/controller/
•IndexController
•ItemController
app/model/
•Item
Classes à créer
app/kernel/
•Kernel
•Controller
•Model
•View
•Router
•Database
21

Vues à créer
En général on crée une vue par action.
Ici il y a deux contrôleurs avec action «display»
app/view/
•index/display.html
•item/display.html
•error/404.html
22

Discussion

Extensions possibles
1. "Plusieurs modèles de vues : système de thèmes
2."Vues modulables (header, footer, sidebar, etc)
3. "Présence d’un back- et d’un front-office :
"Il faut identifier les éléments communs ou spécifiques
4."Notion de session (droits d’accès)
5."Routeur plus élaboré (expressions régulières,
extraction automatisée des paramètres)
6. Gestion des formulaires
24

Télécharger les sources
25
https://github.com/kleliboux/code-samples

MERCI
@NOVLANGUE SUR TWITTER
COMMENTAIRES, DISCUSSIONS, QUESTIONS