PHP 05 MVC
PHP 05 MVC
PHP 05 MVC
SOMMAIRE
Sommaire ...................................................................................................................................... 1
MVC .............................................................................................................................................. 2
Problématique : quels fichiers, quels dossiers pour mes projets .............................................................. 2
Organisation non-MVC ............................................................................................................................ 2
Principes d’organisation non-MVC ............................................................................................................. 2
Défauts de l’organisation non-MVC ........................................................................................................... 2
Présentation du MVC .............................................................................................................................. 3
Présentation ............................................................................................................................................... 3
Le Modèle (SQL) ......................................................................................................................................... 3
La Vue (HTML) ............................................................................................................................................ 3
Le Contrôleur (PHP) .................................................................................................................................... 3
Fonctionnement global ............................................................................................................................... 4
MVC : design pattern tête la première ....................................................................................................... 5
Organisation des fichiers dans le MVC ..................................................................................................... 6
Organisation de répertoires MVC ............................................................................................................... 6
Les fichiers « modèle » ............................................................................................................................... 6
Les fichiers « contrôleur » .......................................................................................................................... 6
Les fichiers « vue » ...................................................................................................................................... 6
Le font contrôleur = contrôleur global = routeur ...................................................................................... 7
Présentation ............................................................................................................................................... 7
Le fichier index.html ................................................................................................................................... 7
Le fichier indexSwitch.html : le routeur ..................................................................................................... 7
Variante ...................................................................................................................................................... 8
Exemple : le blog ..................................................................................................................................... 9
Cahier des charges ...................................................................................................................................... 9
Bilan d’organisation .................................................................................................................................... 9
Exemple de contrôleur : controleur/blog/indexArticles.php ................................................................... 11
Exemple de vue : vue/blog/indexArticles.php .......................................................................................... 14
Exemple de modèle : fichier modele/blog/getArticlesLimit.php .............................................................. 16
PROJET : QUIZZ en ligne ........................................................................................................................ 18
Méthode générale .................................................................................................................................... 18
Etape 1 : .................................................................................................................................................... 18
Etape 2 : .................................................................................................................................................... 18
Etape 3 : .................................................................................................................................................... 18
https://openclassrooms.com/courses/votre-site-php-presque-complet-architecture-mvc-et-bonnes-
pratiques/avant-propos-comment-fonctionne-ce-tutoriel
https://openclassrooms.com/courses/adopter-un-style-de-programmation-clair-avec-le-modele-
mvc
Organisation non-MVC
Présentation
MVC : Modèle - Vue - Contrôleur.
L’architecture MVC sépare la logique du code en trois parties, trois ensembles de fichiers.
Cela rend le code plus facile à mettre à jour et permet d’organiser le travail en 3 parties et donc de
travailler en parallèle.
L’architecture MVC est une bonne pratique de programmation.
La connaissance de l’architecture MVC rend capable de créer un site web de qualité et facile à
maintenir.
En pratique, les architectures MVC mises en œuvre s’appuient sur la théorie mais l’adaptent de
façon pragmatique. Il y a donc plusieurs façons de mettre en œuvre le MVC.
Les principaux framework sont développés en MVC : CodeIgniter, CakePHP, Symfony, Jelix, Zend
Framework.
Le Modèle (SQL)
Il gère les données du site. Essentiellement les accès à la BD. Mais aussi la gestion de fichiers. Il
propose des fonctions pour faire des Insert, des Update, des Delete, des Select. Ces fonctions
peuvent renvoyer des tableaux de données. Les résultats seront exploités par le contrôleur.
C’est une page pur php.
L’idée générale est que dans une application, la base de données est centrale. Si la BD est bien
conçue, l’application sera facile à maintenir et à faire évoluer. Si la BD est mal conçue,
l’application sera complexe à maintenir.
La Vue (HTML)
Elle affiche la page HTML. Elles récupèrent des variables du Contrôleur pour savoir ce qu’elles
doivent afficher.
On y trouve essentiellement du code HTML mais aussi quelques boucles et conditions PHP
très simples, pour afficher les tableaux de données issus du Modèle.
La vue contient le DOCTYPE. Mais elle ne peut fonctionner qu’avec le contexte du contrôleur.
Le Contrôleur (PHP)
C’est la page appelée (le véritable index).
Il fonctionne en trois étapes :
1. Il utilise les fonctions du Modèle (include et appel aux fonctions).
2. Il analyse et traite les données issues du Modèle mais aussi celles passées en paramètre à
l’appel de la page ($_GET, $_POST, $_SESSION). Il détermine par exemple si le visiteur a
le droit de voir la page ou non.
3. En fonction de ses calculs, il appel la vue correspondante par un include.
C’est une page pur php.
Le rôle du contrôleur peut se limiter à faire le lien entre le modèle et la vue : de la colle !
Fonctionnement global
Un utilisateur, à travers une vue, fait appel à une page : un contrôleur (par un href ou un formulaire).
Le contrôleur « include » un modèle et utilise une des fonctions du modèle.
Il fait ensuite des calculs.
Selon les résultats, il include une vue ou une autre à afficher à l’utilisateur.
Et ainsi de suite.
On dit que le MCV est un design pattern 5DP). C’est en réalité un assemblage de DP élémentaires
(un par lettre) : les DP « stratégie », « composite » et « observateur » (les DP ont des noms).
Si on code réellement ces DP, alors on aura une mise à jour automatique des notifications (DP
observateur).
Présentation
On se dotera d’un contrôleur global qui permet l’entrée dans le site et qui permet de choisir le
contrôleur à appeler donc la page à afficher.
C’est le « front contrôleur » ou « routeur ». On retrouve le terme de « routeur » dans les frameworks.
Les autres contrôleurs sont parfois appelés backContoller.
Son rôle est de déterminer quel contrôleur appeler et de faire des initialisations générales (connexion
à la BD, affichage d’en-tête ou de pied de page, etc.).
Le fichier index.html appellera le routeur avec une route particulière, c’est-à-dire un contrôleur
particulier, donc une page particulière à afficher.
Le fichier index.html
Il appelle ici le fichier indexSwitch qui est le front controleur.
<?php
// on appelle indexSwith en settant indexArticle avec n'importe
quel valeur
header('location: indexSwitch.php?indexArticles=set');
?>
// LE BLOG
if (isset($_GET['indexArticles']) {
include('controleur/blog/indexArticles.php');
}
elseif (!empty($_GET['indexCommentaires']) {
include('controleur/blog/indexCommentaires.php');
}
//etc.
empty() ou isset()
C’est presque la même chose. empty() est vrai pour non défini, =0 ou =null. isset() est faux
uniquement pour non défini.
http://php.net/manual/fr/function.empty.php
Déconnexion
Pour libérer proprement la BD.
En PDO, la déconnexion n’est pas utile si on a fait des close cursor
include('modele/deconnexion_sql.php'); // deconnexion à la BD
Variante
On pourrait avoir un routeur qui reçoit le nom du contrôleur en paramètre et qui ainsi appelle le
contrôleur avec ce paramètre : ainsi on n’a plus besoin de swich :
...
//On inclut le contrôleur s'il existe et s'il est spécifié
if (!empty($_GET['page']) &&
is_file('controleurs/'.$_GET['page'].'.php'))
include 'controleurs/'.$_GET['page'].'.php';
else
include 'controleurs/accueil.php'; // controleur accueil
...
is_file()
Si on passe le nom du fichier en paramètre, il faut vérifier. On peut aussi le passer en dur.
Bilan d’organisation
Dossiers et routeur
Les contrôleurs
Les includes
Les vues
Inclusion du modèle
<?php
// MODELE : inclusion des fonctions
//////////////////////////////////////////////
include_once('modele/blog/getArticles.php');
include_once('modele/blog/getArticlesLimit.php');
include_once('modele/blog/countCommentaires.php');
include_once('modele/blog/countArticles.php');
Début du contrôleur
// CONTROLEUR
Ø Mise à jour d’une variable : $tousLesArticles si on doit afficher tous les articles
// MISE A JOUR de $tousLesArticles
// ENTREE POST par boutonTousArticles
// ou par hidden sur haut, bas, monter descendre
// ENTREE GET par retour des commentaires
if( ( isset($_POST['tousLesArticles']) AND
$_POST['tousLesArticles']==1 ) OR
( isset($_GET['tousLesArticles']) AND
$_GET['tousLesArticles']==1 ) OR
isset($_POST['boutonTousLesArticles'])
)
$tousLesArticles=1;
else
$tousLesArticles=0;
Ø Mise à jour d’une variable : $debut pour savoir quels articles afficher
C’est compliqué !!!
// MISE A JOUR de $debut
// ENTREE par BOUTONS haut, bas, monter, descendre : POST -->
// ENTREE par RETOUR de commentaires : GET -->
// il faut redonner la bonne valeur à $debut
$nbMessages=3; // nombre de messages affichés en même temps
$step=1; // la marche de montée et de descente
$debut=0; // position de début d'affichage
Ø Récupération des articles à afficher dans $articles en fonction de ce qu’on a fait avant
// RECUPERATION DES ARTICLES
if($tousLesArticles==0)
$articles = MODELE_getArticlesLimit($debut, $nbMessages,
1); // 1 : les visibles
else
$articles = MODELE_getArticles(1); // les visibles
// echo '<pre>'; print_r($articles); echo '</pre>';
Inclusion de la vue
// VUE : On affiche la page
/////////////////////////////////////////////////////////////
include_once('vue/blog/indexArticles.php');
<div class="articleEtDate">
<p class="dateArticle"><em><?php
// AFFICHAGE DE LA DATE
// on crée un objet date
$nbCommentaires=MODELE_countCommentaires($article['id'], 1); // 1
pour les commentaires visibles?>
<em><a
href="indexSwitch.php?indexCommentaires=1&idArticle=<?php
echo $article['id'] ?>&debut=<?php echo $debut
?>&tousLesArticles=<?php echo $tousLesArticles ?>">
<br/> <?php echo $nbCommentaires;?>
commentaire<?php if ($nbCommentaires >1) echo 's';?>
</a></em>
</p>
</div>
</div>
<?php } ?>
</article>
<aside class="aside">
Mon aside à remplir
</aside>
</section>
<?php include("include/footer.php"); ?>
</body>
</html>
Bilan
On a peu de code php dans la page. C’est gérable par un non expert.
On pourrait même récupérer $nbCommentaires dans le contrôleur pour éviter l’usage de la fonction
MODELE_countCommentaires().
De même, le nettoyage du texte avec nl2br(htmlspecialchars()) pourrait être confié au contrôleur
pour limiter la charge php de la vue.
Calcul de reqSQL
if($visible==10){ // pour une raison obscure
$reqSQL='
SELECT id, titre, contenu, dateCreation, visible
FROM articles
ORDER BY dateCreation DESC LIMIT :offset, :limit
';
}
else{
$reqSQL='
SELECT id, titre, contenu, dateCreation, visible
FROM articles
WHERE visible= :visible
ORDER BY dateCreation DESC LIMIT :offset, :limit
';
}
// DATE_FORMAT(dateCreation, \'%d/%m/%Y à %Hh%imin%ss\') AS
dateCreationFR
$requete->closeCursor();
Méthode générale
Problème n°1 : la conception de la BD.
Le projet se fait par étape. On sauvegarde chaque étape et on fait monter la progression à partir de
l’étape précédente.
L'application doit être restructurée à chaque fois pour garder une application propre.
On utlise le versionnement en conservant les étapes. Dans l’idéal, il faudrait utiliser le
versionnement Git pour marquer les différentes versions du projet (repository Git, commits
progressifs et commits de "release », usage pertinent des branches).
Etape 1 :
Un quiz comporte entre 1 et 10 questions
Pour chaque question, on doit choisir 1 réponse parmi 2 à 5 choix de réponses proposés
Lorsque le quiz est envoyé, on affiche les résultats : un score (en % de bonnes réponses) et la liste
des bonnes et mauvaises réponses s'affiche. Si on a fait une erreur, on doit nous indiquer quelle était
la bonne réponse
Une page d'accueil recense tous les quiz. Chaque quiz a un titre.
Etape 2 :
Au lieu d'une seule réponse possible, on doit pouvoir sélectionner plusieurs réponses.
Certaines questions n'autorisent qu'une seule réponse (vous afficherez des boutons radio) et
certaines questions autorisent plusieurs réponses (vous afficherez des cases à cocher).
On veut que la personne ne puisse faire le quiz qu'une seule fois. Dès que le quiz a été rempli, il
n'est plus possible de le faire à nouveau.
Etape 3 :
On veut aussi pouvoir proposer 2 autres types de questions :
Un nombre à saisir
Des éléments à ordonner
Un quiz peut donc être composé de 4 questions.
De plus, il faut que l'utilisateur puisse refaire le quiz autant de fois qu'il le veut et qu’il puisse afficher
l'historique de ses réponses.