Skip to main content

Mettre en place un architecture MVC avec PHP

Le Modèle MVC

Le modèle MVC pour : Model - View - Controller est un Design Pattern visant à séparer une application en trois modules :

  • Modèle : les données
  • Controlleur : traite les données et mets à jours la vue
  • Vue : Définit l'interface utilisateur

Si on applique au modèle du Web cela donne le schéma suivant :

web-mvc.png

MCV en PHP Vanilla

Commeçons par créer une arborescence de dossiers pour ranger nos scripts en fonction des différents modules de MVC :

  • Un dossier model : contient des scripts qui contiennent des fonctions de requêtes SQL ainsi qu'un script de connexion à la base de donnée.
  • Un Dossier view : va contenir des fichier .tpl qui à partir desquels seront générées des pages HTML.
  • Un dossier controller : contient des scripts qui vont faire appel aux fonctions du model afin de récupèrer des données, les traiter, puis faire appel à la vue correspondante.

et un fichier index.php pour le routage.

Le routage

Pour accèder aux service des controleurs on va passer dans chaque requêtes une variable controller et une variable action en paramètre d'URL. Exemple : http://localhost/index.html&controller=user&action=login. Si bien qu'on fera toujours appel à index.html, qui lui s'occupera d'appeler la bonne action du bon controleur. Le code qui s'en occupe est le suivant :

if (isset ( $_GET ['controller'] ) & isset ( $_GET ['action'] )) {
	$controle = $_GET ['controller'];
	$action = $_GET ['action'];
} else { // absence de paramètres : prévoir des valeurs par défaut
	$controle = "user";
	$action = "login";
}

// Inclure le fichier php de contrôle
// Et lancer la fonction-action issue de ce fichier.

require ('./controller/' . $controle . '.php');
$action ();

Connexion à la base de donnée

On va créer un script de connexion à la base de donnée connectDb dans le dossier model et on y écrit la fonction suivante :

function connect(){
  $hostname = "localhost";
  $base = "nom de la base de donnée";
  $loginBD = "root";
  $passBD = "mot de passe de la base de donnée";

  try {
      $bdd = new PDO ( "mysql:server=$hostname; dbname=$base", "$loginBD", "$passBD", array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
      return $bdd;
  } 
  catch ( PDOException $e ) {
      echo "Echec de connexion à la base de donnée";
      die ( "Echec de connexion : " . $e->getMessage () . "\n" );
  }
}
```