le MVC dans le contexte web

La logique applicative (modèle) est constituée des scripts réalisant les demandes de l'utilisateur, des classes métiers et des classes d'accès aux données
L'interface utilisateur (vue) sera géré la plupart du temps par un navigateur web, elle peut éventuellement être un  autre site web communiquant via des webservices. Dans les deux cas tout va se passer via HTTP.
La source de données sera une base de données dans toute la suite mais pourrait parfaitment être un serveur LDAP, un webservice, des fichiers texter ou encore XML.

le MVC est bien adaptée à des applications web écrites avec des langages orientés objet, nous allons essayer de tirer le meilleur parti des nouveautés de PHP5.

diagramme générique d'une application web/php MVC

mvc.gif
  • couche ihm: c'est l'interface utilisateur encore appelé interface homme machine
  • couche métier : c'est le coeur de l'application où réside les objets tréités par l'application
  • couche dao : couche d'accès aux données (data access object). Cette couche permet une indépendance de la logique métier et du stockage des données associées
  1. le client fait une demande au controleur. Ce contrôleur voit passer toutes les demandes des clients
  2. le contrôleur traite la demande. Pour ce faire, il peut avoir besoin de l'aide de la couche métier, et éventuellement de la couche dao.
  3. le contrôleur reçoit une réponse de la couche métier et effectue les actions demandées par l'utilisateur
  4. le controleur sélectionne et nourrit une vue pour présenter les résultats de l'action qui vient d'être effectuée
  5. la vue est enfin envoyée au client

Proposition d'architecture

Interaction utilisateur

Il est raisonnable de raisonner par action. Une action sera vue comme une partie inséquable du code du contrôleur.
l'interaction utilisateur se fait via les variables http soit par des variables associées à l'url en methode GET ou par des variables de formulaires en méthodes GET ou POST.
Ces variables devront donc contenir en premier lieu l'action que le controleur a à effectuer (nous appellerons cette variable '$action').

Le controleur

Le controleur devra donc commencer par analyser la requête http afin d'en extraire l'action réaliser. D'autres variables pourront être passées pour les besoin d'un traitement.
Une fois l'action l'ocalisée elle sera exécutée. Une vue devra lui être affectée
le début  du controleur ressemblera donc à ça

if($_GET['action']) // appel d'une action via la méthode http GET
{
   $action = $_GET['action'];
}
elseif($_POST['action']) // appel d'une action via la méthode http POST
{
   $action = $_POST['action'];
}
else // acune action n'est appelée on affiche la page d'accueil
{
   $action='index';
}
if(is_callable($action)) // on vérifie que l'action est bien définie dans le controleur
{
   call_user_func($action);
}
else
{
   call_user_func('404');
}

Une action peut alors être vue comme une fonction déclarée dans le controleur du même nom que l'action a effectué, ou comme un fichier à inclure du même nom que l'action, contenant le code à exécuter.
les actions index et 404 doivent être définies quoiqu'il arrive.

chargement des classes

A priori une action va faire appel à un ou plusieurs objets. Il est donc indispensable que les bonnes classes soient chargées lors de l'exécution d'une action. Le principe de chargement automatique des classes mis à disposition par PHP5 paraît tout indiqué. Le tout est de s'accorder sur une logique de stockage des classes métiers. Si toutes les classes sont stockées dans un répertoire nommé obj à la racine du site dans des fichiers nommés selon la convention suivante nom_de_classe.class.php la fonction de chargement automtqieu ressemblerait alors à quelque chose comme ça:

function __autoload( $nom_de_classe )
{
   require_once('obj/'.$nom_de_classe.'.class.php');
}

sélection de la vue

Il est intéressant de bien distinguer les parties statiques des parties dynamiques. La parties statiques seront icluses systématiquement par le controleur, alors que les les vues affectées aux parties dynamiques seront sélectionnées foncions de l'action demandées par l'utilisateur. La encore tout est question d'organisation.

Les fichiers core

Afin de factoriser au maximum le code à écrire nous regrouperons tout le code générique dans un dossier (que nous appellerons 'mvc'). ce dossier sera le coeur de notre application.

Les modèles

la couche dao
La plupart du temps les données seront stockées dans une bases de données. Une bonne idée pour rendre la couche dao indépendante du stockage est de passer par une couche d'abstraction base de données (PDO, PEAR::MDB2, creole, ...). Il est à noter que souvent les objets métiers vont avoir des méthodes communes d'accès et de manipulation des données: typiquement les méthodes CRUD (Create Read Update Delete) risquent d'être communes à tout objets stockés en base de données.
Une autre approche tentante est de déduire la plus grande partie du modèle en analysant la description du stockage des données. Dans le cas d'une base de données par exemple, on peut associer un objet à une table, et en listant les champs de cette table en déduire dynamiquement les attributs de l'objet. Ce processus porte le nom de couche ORM (Object Relational Mapping) (propel, doctrine, ...).
la couche métier
Pour les classes métier il sera util de les regrouper dans un seul et même dossier (que nous appellerons 'model'). Ces classes comporteront typiquement les traitements métiers

généralités sur les modèles

Aucune sortie html ne doit être contenu dans les méthodes des classes métiers ou dao.