Refactorisation
Utilisez une architecture MVC en PHP : changer l'organisation de son code
Création d'une table posts
Nouvelle table posts à ajouter dans votre base de donnéesCréé une table posts avec un champ id (integer), title (varchar), content (text) et creation_date (datetime)
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>
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>
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 !).
ℹ 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
l'ancien code est dorénavant encapsulé dans une fonction getPosts
3. Le contrôleur : index.phpLa 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.
<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;
}
?>
3. Le contrôleur : index.php
<php
require('model.php');
$posts = getPosts();
require('indexView.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)
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 ...; ?>
<!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>
> Voir cet exemple Easy-Micro