Easy-Micro

LANGAGE MVC PHP
Refactorisation

Utilisez une architecture MVC en PHP : changer l'organisation de son code

MVC PHP par Easy-Micro Création d'une table posts

Nouvelle table posts à ajouter dans votre base de données
Créé une table posts avec un champ id (integer), title (varchar), content (text) et creation_date (datetime)

PHP 1. Isoler l'affichage du traitement PHP

Nous faisons ici ce qu'on appelle de la refactorisation. On change l'organisation du code, sans ajouter de nouvelles fonctionnalités. Le but est d'avoir un code plus facile à modifier par la suite. Commençons par séparer la partie qui s'occupe de récupérer les données de celle qui les affiche.

<?php
// Partie qui récupére les données
try {
    $bdd = new PDO('mysql:host=localhost;dbname=mabase;charset=utf8', 'root', '');
}

catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
}

$req = $bdd->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');
?>

<!-- Partie affichage -->

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link href="style.css" rel="stylesheet"> 
    </head>
    <body>
        <h1>Mon super blog !</h1>
        <p>Derniers billets du blog :</p>
 
        
        <?php
        while ($donnees = $req->fetch())
        {
        ?>
        <div class="news">
            <h3>
                <?php echo htmlspecialchars($donnees['title']); ?>
                <em>le <?php echo $donnees['date_creation_fr']; ?></em>
            </h3>
            
            <p>
            <?php
            echo nl2br(htmlspecialchars($donnees['content']));
            ?>
            <br>
            <em><a href="#">Commentaires</a></em>
            </p></div>
        <?php
        }
        $req->closeCursor();
        ?>
    </body>
</html>

PHP 2. Séparer en deux fichiers distincts

Un fichier index.php (le fichier de base de votre site lu en premier) qui s'occupera de récupérer les données et d'appeler l'affichage. Un fichier affichageAccueil.php qui affichera les données dans la page.

index.php :
<?php
// Récupération des données
try {
    $bdd = new PDO('mysql:host=localhost;dbname=mabase;charset=utf8', 'root', '');
}

catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
}

$req = $bdd->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');

require('affichageAccueil.php');
?>

affichageAccueil.php :
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link href="style.css" rel="stylesheet"> 
    </head>
    <body>
        <h1>Mon super blog !</h1>
        <p>Derniers billets du blog :</p>
        
        <?php
        while ($donnees = $req->fetch()) {
        ?>
        <div class="news">
            <h3>
                <?php echo htmlspecialchars($donnees['title']); ?>
                <em>le <?php echo $donnees['date_creation_fr']; ?></em>
            </h3>
            
            <p>
            <?php
            echo nl2br(htmlspecialchars($donnees['content']));
            ?>
            <br><em><a href="#">Commentaires</a></em></p></div>
        <?php
        }
        $req->closeCursor();
        ?>
    </body>
</html>

PHP 3. Isoler l'accès aux données

Nous allons séparer complètement l'accès aux données (tout le traitement SQL) dans un fichier spécifique. Nous allons avoir 3 fichiers :
  • model.php : se connecte à la base de données et récupère les billets.
  • indexView.php : affiche la page. Ce fichier ne va pas changer du tout.
  • index.php : fait le lien entre le modèle et l'affichage (oui, juste ça !).
On y reviendra, mais sachez que ces 3 fichiers forment la base d'une structure MVC (Modèle - Vue - Contrôleur) :
  • Le modèle traite les données (model.php)
  • La vue affiche les informations (indexView.php)
  • Le contrôleur fait le lien entre les deux (index.php)

ℹ Les développeurs sont aujourd'hui de toute nationalités. Il est donc beaucoup plus commode d'avoir un code en anglais, des bases de données en anglais, des fichiers en anglais...

1. Le modèle : model.php
<php
function getPosts() {
    try {
        $db = new PDO('mysql:host=localhost;dbname=mabase;charset=utf8', 'root', 'root');
    }
    catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
    }

    $req = $db->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS creation_date_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');

    return $req;
}
?>
l'ancien code est dorénavant encapsulé dans une fonction getPosts

3. Le contrôleur : index.php
<php
require('model.php');

$posts = getPosts();

require('indexView.php');
La nouveauté, c'est désormais l'index (le contrôleur) qui sert d'intermédiaire entre le modèle et la vue. Remarquez que la balise de fermeture du php à disparue suivant la recommandation officiel : The closing ?> tag MUST be omitted from files containing only PHP.

Un short open tags permet d'éviter d'avoir à écrire echo quand on souhaite juste afficher une variable. Le but est d'être plus lisible dans la vue en enlevant le maximum de code PHP là-dedans (même si on ne peut pas tout enlever).

Les frameworks PHP tels que Symfony ont carrément développé un langage de template (appelé Twig pour Symfony), qui permet de ne pas utiliser du tout de code PHP dans notre affichage.

2. La vue : indexView.php (pas de changement)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Mon blog</title>
        <link href="style.css" rel="stylesheet"> 
    </head>
        
    <body>
        <h1>Mon super blog !</h1>
        <p>Derniers billets du blog :</p>
 
        
        <?php
        while ($data = $posts->fetch()) {
        ?>
            <div class="news">
                <h3>
                    <?= htmlspecialchars($data['title']) // short open tags ?>
                    <em>le <?= $data['creation_date_fr'] ?></em>
                </h3>
                
                <p>
                    <?= nl2br(htmlspecialchars($data['content'])) // short open tags ?>
                    <br><em><a href="#">Commentaires</a></em></p>
            </div>
        <?php
        }
        $posts->closeCursor();
        ?>
    </body>
</html>
Le code de indexView.php est dorénavant entièrement en anglais. Remarquez l'utilisation des "short open tags" en PHP pour faciliter la lisibilité du code : <?= ... ?> correspond à <?php echo ...; ?>

> Voir cet exemple Easy-Micro

« Prev - Architecture MVC en PHP - Next »


< Page précédente MVC PHP Page suivante >