Construire votre structure MVC

Le projet PHP devra respecter l'architecture MVC (Modèle Vue Contrôleur).

Dans un projet web avec une structure MVC, la structure de vos pages devra respecter une certaines architecture. Le but de cette architecture est de forcer la décomposition de l'ensemble des éléments de création d'une page web. De cette façon vous allez avoir des fichiers avec le moins de lignes de codes possible et chaque fichier aura une fonction bien précise.

Des fichiers ne vont faire que de l'affichage html, avec un peu de PHP pour afficher le contenue des variables PHP (les vues).
Des fichiers vont jouer les aiguilleurs en récupérant la demande du client pour choisir les bons objets et les bonnes méthodes avant de renvoyer les informations à la partie vue (les contrôleurs).
Les classes PHP qui effectuent toutes les tachent de traitement de l'information représentent le Modèle

Tous ces fichiers sont séparés physiquement dans des répertoires distincts. Ce qui facilite le travail de chaque personne qui travail sur le projet.

Le but de cette architecture est d'aider les développeurs à coder plus rapidement en séparant bien chaque partie de l'application. Les développeurs ne vont s'occuper que des fichiers contenant du PHP (modèle et contrôleurs), les intégrateurs HTML, CSS s'occupent eux, des fichiers HTML, CSS (vue). On évite au maximum que les intégrateurs ouvrent des fichiers PHP et que les développeurs ouvrent des fichiers HTML. Cela permet surtout d'avoir des fichiers avec le minimum de ligne de code.

Il faut se rappeler que le but de tout développeur c'est d'écrire le moins de lignes de codes possible. Vous devez donc factoriser toutes les instructions qui se répètent et les mettre dans des fichiers que vous allez imbriquer ensuite dans d'autres fichiers. L'ensemble de ses fichiers fabriquera votre page visible sur le navigateur du client.

Avec cette méthode, lorsque vous allez créer une nouvelle page vous n'aurez besoin que d'écrire ce dont vous avez besoin. Tout le reste est déjà écrit dans d'autres fichiers qui vont intégrer votre nouvelle partie.

Factoriser votre code html :

Comme en mathématique on va extraire de vos pages html toutes les parties communes à toutes les pages. Votre blog aura une structure html avec de nombreuses informations qui ne changerons pas d'une page à l'autre. Il faut repérer toutes les informations et structures de pages qui ne changerons jamais d'une page à l'autre et créer un fichier layout.php avec ces informations en communs. En général toute la partie en-tête et pied de page d'un site ne changes jamais. Seule la partie centrale va changer body. C'est cette partie centrale qui va constituer vos fichier « vues ». Ce fichier « layout.php » sera stocké dans un répertoire «Layouts» qui va contenir le ou les fichiers de la structure html du site.

Structure de votre système de fichiers :

Le modèle est un répertoire sur votre disque dur qui va contenir toutes les classes objets PHP du projet. Vous y déposerez toutes vos classes PHP. Les « vues » seront les fichiers de création de l'affichage de l'information. C'est un fichier PHP qui va créer la page html à afficher dans le navigateur. Le fichier ne va contenir que la partie centrale du site. Le Contrôleur d'actions est un fichier qui va indiquer les actions à faire en fonction de la demande passée dans l'url du navigateur. Le contrôleur qui correspond à la page demandée va exécuter toutes les actions nécessaires à la construction de la page html (création d'un objet, récupération d'infos en base de données, préparation des infos pour l'affichage dans la vue). Il va également afficher le fichier de structure de votre site (Layout/structure.php) qui contient les entêtes et pieds de pages de la structure html. L'avantage de cette méthode est que si une page à une structure différentes des autres pages alors vous pourrez indiquer dans le controller concerné qu'il faut récupérer la structure (Layout) de cette page. Par exemple la page d'accueil d'un site qui aurait une structure totalement différentes des autres pages du site ou une partie payement d'un site de e-commerce qui supprimerait toutes les entêtes et pieds de page pour n'afficher que le formulaire de payement.

Vous devrez donc avoir l'arborescence suivante à la racine de votre projet :

Nommage des fichiers et récupération de la page à afficher

Pour que votre modèle MVC fonctionne, il faudra passer le nom de votre page (la vue) dans l'url et la récupérer à l'aide de PHP.
Le nom de la page demandée ne doit pas comporter d'extention (.php etc.).
Ex d'url : www.monsite.fr/maPage

La maîtrise de vos URL pour communiquer avec votre structure MVC

A l'aide du fichier .htaccess de configuration du comportement de votre serveur web, vous allez maîtriser la construction et l'analyse de vos URL.

Dans notre système MVC, nous demandons à notre serveur web d'oublier l'analyse de l'URL et de toujours appeler la fichier index.php à la racine du projet.

C'est donc dans notre fichier index.php que l'on va récupérer et étudier tout ce qui existe dans l'url.

Pour se faciliter la vie on pourra nommer le fichier « vue » et « contrôleur » qui correspond à la page demandée avec le même nom de page passée dans l'url. Ici on aura un fichier vue « maPage.php » et un fichier contrôleur « maPage.php ». Comme les fichiers sont dans des répertoires différents, aucuns problèmes si les fichiers ont le même nom. C'est juste plus facile pour nous de retrouver tous les fichiers qui vont composer une page.

Trouver le bon contrôleur et la bonne vue.

Pour que votre système MVC puissent aller chercher le bon controller et la bonne vue, un fichier "index.php" situé à la racine de votre site va jouer le rôle de chef d'orchestre.
Il va récupérer la variable de la page passée dans l'url avec la méthode vue au dessus.
Vous allez ensuite faire un include du controller qui correspond à la page demandée (ex : include_once('controllers/maPage') ;).
Ensuite vous allez faire un include de la vue correspondante (ex : include_once('views/maPage.php') ;).

Rôle du fichier « index.php » à la racine du site

Votre fichier "index.php" comme expliqué plus haut sera le chef d'orchestre de votre site.
Il va récupérer l'url de la page demandée et traiter les infos passées en paramètres.
Il va récupérer les fichiers de configuration, connexion BDD, action, affichage...

Votre fichier index.php sera appelée à chaque chargement de page. Il sera donc dans tous vos urls.
Ex : html://www.monsite.fr/index.php

Vous pourrez créer une fonction ou un objet pour récupérer et traiter les variables passées en paramètres dans l'url (ex : parseUrl.php).

Le fichier index.php : le lanceur de votre système

Pour lancer votre application web avec le format MVC il vous faudra un fichier index.php situé à la racine de votre serveur web. C'est ce fichier qui va lancer et démarrer votre application. Votre fichier index.php ne devra donc contenir que du code PHP et aucun code html car le fichier ne sera pas utilisé pour de l'affichage mais uniquement de la configuration et lancement du modèle MVC.

Dans notre projet PHP de création d'un blog, le fichier index.php devra réaliser les actions suivantes :

Récupération du fichier de configuration du site.

require_once 'conf.inc.php';

Récupération du fichier d'appel automatique des classes PHP.

Comme ça plus besoin de faire des 'include' de vos classes.

require_once 'autoload.php' ;

Composition du fichier autoload.php


<?php
/**
 * Cette fonction appele automatiquement une classe php
 * sans avoir besoin de faire un "include" ou "require"
 * Une simple demande d'instanciation d'un objet appel automatiquement cette méthode
 */

spl_autoload_register(function ($class_name) {
    (file_exists(DIR_PHP_CLASS.'/'.$class_name.'.class.php'))?	
    require_once DIR_PHP_CLASS.'/'.$class_name.'.class.php' : '';
});

?>

Connexion à la base de données

$dbConnect = new DbTools(); 

La variable $dbConnect devient globale car la connexion a été créée hors contexte. Pour récupérer la connexion dans une de vos fonctions PHP il faudra la déclarer comme variable globale au début de la fonction:

public function myFonction(){
     global $dbConnect;  
    //suite de mon code PHP...
} 

Récupération des variables de l'URL avec $_GET et construction du nom de page à afficher


    //On recupère la variable "page" contenue dans l'url
    $page = $_GET['page'];
//Construction du nom de la page à afficher //Si $page est null on affiche la page d'accueil du site $pageName = ($page != '')? $page.'.php' : 'accueil.php';

On lance le contrôleur correspondant à la page ce qui va démarrer le système jusqu'à l'affichage.

include_once 'controllers/'.$pageName; 

Fin du fichier index.php

Le fichier contrôleur : il pilote les actions à réaliser

Le fichier contrôleur est un fichier PHP qui va jouer le chef de projet.
C'est ici que vous allez indiquer la structure de page html (Layout) à utiliser pour afficher la vue qui correspond au contrôleur.
C'est ici que vous allez communiquer avec la partie models (classes PHP) en ajoutant des actions à réaliser pour le traitement des informations.
Soit il s'agit de récupérer des informations de la base de données et les formater avant de les afficher dans la vue.
Soit il s'agit de récupérer des informations de la vue pour les enregistrer dans la base de données.
Dans ces cas, c'est ici que l'on fait appel à nos classes PHP pour traiter et gérer les informations de notre site Internet (système d'informations).
Ensuite, le fichier contrôleur va indiquer quelle structure html (layout) le site va devoir utiliser pour afficher nos informations.

Exemple de fichier controller


 <?php   
 /******************************************************
 * ---Partie Action----------
 * Ecrivez ici vos instructions PHP avant de charger votre layout et votre vue
 */
$article = new article();
$result = $article->getAllArticlesDb();


/******************************************************
 * ----Partie Affichage------
 * ! Important !  
 * Uniquement une fois que le traitement des informations est terminé 
 * on passe à la gestion de l'affichage
 * Si la partie affichage est située avant la partie -action- vous ne pourrez pas 
 * récupérer les informations PHP de la partie action dans votre vue html. 
 */
include_once 'layouts/layout.php';
?>

Explications

Le fichier contrôleur ci-dessus correspond au contrôleur de la page d'accueil.
Nous souhaitons afficher la liste de tous les articles enregistrés dans la base de données.
Pour cela nous allons créer un objet $article à l'aide de la classe article.

    $article = new article();

Ensuite, nous allons pouvoir utiliser une méthode de la classe article que vous avez créé, et qui va récupérer la liste des articles en base de données getAllArticlesDb().
Cette fonction, que vous avez fabriqué, devra renvoyer un tableau qui contient l'ensemble des articles issue de la base de données.

    $result = $article->getAllArticlesDb();

Maintenant, vous avez l'ensemble de vos articles dans la variable $result qui est un tableau dont chaque ligne contient un article.
Ensuite, il faudra afficher le contenu de $result dans la vue associée à votre contrôleur.

    include_once 'layouts/layout.php';

Jusqu'ici aucune balise html ne doit avoir été écrite dans les fichiers ci-avant. Le code html ne doit apparaître que dans les fichiers layout.php et vue.php.

Le fichier Layout : contient la structure html de votre site

Votre fichier de structure html va contenir toutes les entetes html et pieds de page.
Il va contenir aussi votre menu haut si vous en avez un et toutes les balises html qui ne sont pas dédiées à votre vue.
    
<!DOCTYPE html>
<html>
    <head>
        <title>Projet PHP - Estiam</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="<?=PATH_CSS?>/style.css">
        <link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Varela+Round&display=swap" rel="stylesheet">
    </head>

    <body>
    <header>  
      <nav class="menu">
      <ul>
          <li><a href="/">Accueil</a></li>
          <li><a href="/nomPage">Menu 1</a></li>
          <li><a href="/nomPage">Menu 2</a></li>
          <li><a href="/nomPage">Menu 3</a></li>
          <li><a href="/nomPage">Menu 4</a></li>
          <li><a href="/nomPage">menu 5</a></li>
      </ul>  
      </nav> 
    </header> 
      
        <section>     
         <?php 
         //On appelle la vue
         include_once 'views/'.$pageName;
         ?>  
        </section>
   
        <footer></footer>
    </body>
</html>   


    

Le fichier vue : affiche uniquement le code html nécessaire à votre page

Ni plus ni moins !!! Juste l'essentiel.


        //Affichage d'un formulaire d'enregistrement d'un utilisateur
<form method="post" action="" name="contact" enctype="multipart/form-data"> <input type="text" value="" name="nom" /> <input type="text" value="" name="prenom" /> <input type="text" value="" name="email" /> <input type="text" value="" name="passWord" /> <input type="submit" name="valider" value="Enregistrer"/> </form>

En résumer

Votre fichier index.php va lancer votre application et passe la balle au controlleur.
Le controlleur regarde ce qu'il faut faire et execute le code PHP pour traiter la demande d'information.
Le controlleur passe ensuite la balle à la structure html pour afficher les informations sur le navigateur (layout).
Le Layout (maStructureHtml.php) prépare la page html d'affichage des informations dans le navigateur et passe la balle à la vue.
La vue va mettre en forme (html, css...) les informations récupérées dans le controlleur pour les afficher sur le navigateur.