Pré-requis
- Connaissance des bases de la programmation orientée objet en PHP5 ;
Introduction
Bonjour

Voici la question que beaucoup se posent après avoir développé et lutté pour maintenir un site conséquent : Comment programmer de façon claire en PHP ?
Un modèle célèbre existe, le système
Modèle
Vue
Contrôleur.
Organisation
Le système MVC consiste à diviser chaque "page" classique en trois fichiers correspondant aux trois couches de programmation :
- Les données ;
- Les traitements, la logique ;
- L'affichage.
Pour cela nous organisons la hiérarchie de notre site en créant les dossiers controleurs, modeles et vues.
Pour illustrer cela de manière simple, lorsque l'utilisateur de votre site demandera d'afficher une "page" classique, un fichier de chaque dossier sera appelé pour constituer celle-ci.
Le modèle
Le modèle récupère les données nécessaires pour satisfaire la demande du contrôleur. C'est donc dans ce fichier que vous ferez les appels à votre base de données ou que vous récupérez les données depuis un fichier texte par exemple.
Etant donné que dans la majorité des cas le PHP est couplé au SQL, il est courant d'utiliser des requêtes de
sélection, d'
insertion, de
mise à jour et de
suppression
La classe commune
Afin de permettre la réutilisation des méthodes et d'éviter la redondance du code pour gérer une sélection simple par exemple dans chaque modèle, nous allons définir une classe
abstraite qui :
- permettra de gérer la construction des requêtes paramétrées ;
- sera hérité par tous les fichiers de type Modèle de notre site.
Voici un exemple de la base de notre classe abstraite :
<?php
abstract class Model
{
private $table;
// identifiant de connexion
protected $mysql;
public function __construct($table)
{
$this->table = $table;
// constantes définies dans un fichier de configuration
$this->mysql = mysql_connect(HOST, USER, PASS);
}
}
Le constructeur prend ici un seul paramètre correspondant au nom de la table sur laquelle s'effectuera nos requêtes. Il se charge également d'ouvrir une connexion MySQL et de stocker l'id de connexion dans un attribut privé de la classe.
C'est le moment d'ajouter notre première requête, celle de la
sélection. Pour simplifier le tutorial, cette requête ne peut sélection qu'un champ au maximum et ne gère pas les ORDER, LIMIT, etc.
public function select($field, $cond = NULL)
{
// construction de la requête
$sql = "SELECT " . $field;
$sql .= " FROM " . $this->table;
if (is_array($cond))
{
$sql .= " WHERE ";
$i = 0;
foreach ($cond as $key => $value)
{
$sql .= ($i != 0)? " AND " : '';
$sql .= $key . " = '" . $value . "'";
$i++;
}
}
$res = mysql_query($sql, $this->mysql);
// on a des résultats
if ($res !== FALSE)
{
/* l'ensemble des résultats est stocké dans un tableau
prêt à être exploité */
$out = array();
while ($data = mysql_fetch_array($res))
{
$out[] = $data;
}
return $out;
}
return $res;
}
Cette méthode prend donc en compte les paramètres nécessaires à effectuer à une selection sur la table,
$field correspondant au champ à sélectionner et
$cond paramètre facultatif qui correspond à la condition de la sélection vous l'aurez compris.
Une fois la chaîne de caractères générée et stockée dans la variable
$sql, nous exécutons la requête pour ensuite retourner le tableau de données récupéré ou false si si la requête a échouée.
Libre à vous d'améliorer cette méthode en fonction des requêtes que vous souhaitez générer
Les modèles descendants
Imaginons que nous développons un blog classique, nous aurons alors besoin d'un modèle commentaires par exemple. Voici comment nous définissons ce modèle :
<?php
require_once 'Model.php';
class Commentaires extends Model
{
public function __construct()
{
parent::__construct('commentaires');
}
}
Comme vous le savez, le mot-clé
extends indique que cette classe hérite de notre classe abstraite et reprend ainsi tous les attributs et méthodes définis dans la classe Model.
Nous pouvons donc appeler la méthode
select sur l'objet Commentaires.
Nous verrons ensuite comment utiliser ce modèle plus précisement.
Le contrôleur
Le contrôleur fait le lien entre le modèle et la vue. Il s'occupe de traiter les données reçues du modèle et d'indiquer à la vue ce qu'elle doit afficher.
Voici comment se définit un contrôleur :
<?php
class ControleurCommentaires
{
private $vue;
public function __construct()
{
require_once '../modeles/Commentaires.php';
$this->vue = array();
}
}
Vous voyez comme c'est extrêmement simple, le constructeur ne fait qu'initialiser le tableau qui sera utilisé par notre vue.
La question qui se pose maintenant est "Comment va faire l'utilisateur pour afficher la page demandée ?".
Les actions
Et bien nous allons introduire des méthodes dans ce contrôleur, plus précisément des
actions. C'est les actions qui seront appelés lorsque l'utilisateur naviguera dans votre site.
Le rôle d'une action est de mettre en relation le modèle et la vue. Voici un exemple d'utilisation :
public function actionAfficher()
{
// on instancie le modèle
$commentaires = new Commentaires();
// on récupère les données
$this->vue['commentaires'] = $commentaires->select('texte');
// on inclut la vue
require_once '../vues/commentaires.php';
}
La vue
La vue a pour rôle de générer le XHTML à l'aide des données reçues du contrôleur qui sont dans ici stockées dans la case commentaires du tableau $vue.
Il suffit donc de parcourir ce tableau et de réaliser l'affichage que l'on souhaite :
<?php if (!$this->view['commentaires']): ?>
<p>Pas de commentaires.</p>
<?php else: ?>
<?php foreach ($this->view['commentaires'] as $commentaire): ?>
<p><?php echo $commentaire['texte']; ?></p>
<?php endforeach; ?>
<?php endif; ?>
Il convient d'adopter ici le style d'écriture "template" afin de se débarrasser des accolades et d'améliorer la lisibilité du fichier.
Le coeur
Pour que la bonne action du bon contrôleur soit appelée lorsque l'utilisateur demande une page, nous devons créer un fichier
index.php qui sera situé à la racine du site et qui servira donc à gérer notre système.
Dans ce tutorial, nous choisissons d'écrire nos URLs de cette façon :
index.php?c=Commentaires&a=Afficher
Voici donc la structure de notre fichier index.php :
<?php
// fichier de configuration
require_once 'config/mysql.php';
$controleursAutorises = array('Commentaires');
// le contrôleur est autorisé et l'action spécifiée
if (isset($_GET['c']) && isset($_GET['a'] && in_array($_GET['c'], $controleursAutorises))
{
// instanciation du controleur
$controleur = 'Controleur' . $_GET['c'];
$controleur = new $controleur();
$action = 'action' . $_GET['action'];
// l'action existe bien, on l'appele
if (method_exists($controleur, $action))
{
$controleur->$action();
}
}
Et voilà

Lorsque l'utilisateur arrive sur l'url http://votresite.com/index.php?c=Commentaires&a=Afficher, l'affichage des commentaires s'effectuera correctement.
Conclusion
Ce tutorial n'est qu'un exemple de MVC "fait maison" simplifié, mais qui vous aura permis, je l'espère, de comprendre le fonctionnement de ce système.
Si vous souhaitez quelque chose de plus performant sans vous casser la tête à essayer de concevoir un système MVC complexe, il existe de nombre
frameworks vous fournissant une structure complète prête à utiliser
