Présentation de la structure MVC

Découvrez la structure MVC !

Présentation de la structure MVC

Découvrez la structure MVC !

Crée le 6 févr. 2021

À quoi sert la structure MVC ?

La structure MVC sert à avoir une structure de dossier et de code permettant à d'autres personnes de se retrouver dans votre code beaucoup plus facilement. Grâce à celle-ci, chaque fichier aura son rôle à jouer et donc vous n'aurez plus vos requêtes, votre html, etc. dans la même base.

Attention, cette structure est à éviter pour les petits projets (site vitrine) car elle demande trop de ressources et d'organisation pour ce qu'elle apporte.

Prérequis

  • Connaissance de PHP
  • Si possible la connaissance de la POO (Programmation Orientée Objet)

Comment se présente la structure MVC ?

Premièrement, à quoi correspond l'acronyme MVC ?

Il s'agit de l'association Model / View / Controller

À quoi correspondent ces noms ?

Le Model : Le model est la partie qui contiendra toutes vos requêtes vers la base de données. Celle-ci se présente sous forme de classes. Par convention, le nom des fichiers d'un model doit toujours être écrit en PascalCase, donc chaque première lettre d'un mot est en majuscule.

Exemple du nom d'un model : MessagesManager.php

La View : La view est la partie ou vous pourrez gérer votre visuel, votre html, vous aurez le droit de faire uniquement des boucles, et des restrictions ayant un impact sur le visuel, par exemple une condition pour la couleur d'affichage. Aucun autre code en php ne doit être écrit à l'intérieur. Par convention, le nom des fichiers d'une view doit toujours être écrit en camelCase : chaque première lettre d'un mot est en majuscule, à l'exception de la toute première !

Exemple du nom d'une view : indexVue.php

Le Controller : Le controller est la partie "mère" qui appellera toutes les autres afin de gérer votre site ; elle appelera le view afin d'afficher votre site, elle appelera le model afin de faire les requêtes adéquates à vos besoins, elle gérera aussi vos réponses au formulaire... Par convention, le nom des fichier d'un controller doit toujours être écrit en camelCase : chaque première lettre d'un mot est en majuscule, à l'exception de la toute première !

Exemple du nom d'un controller : index.php

Quelques exemples

Image de l'arborescence des dossiers en MVC

Sur cette image vous pouvez voir qu'il y a bien plus de dossier que ce que je vous ai cité (je ne vous ai pas trahi rassurez-vous) !

Le dossier assets est le dossier qui contiendra tout ce qui ne correspond pas au code PHP de notre application : comme l'image le montre, des images, du js, du css, les frameworks, les library, etc.

Le dossier entities est lié à un concept de POO (les objets). Le fichier à l'intérieur contient une classe permettant de créer mes objets, mais ce n'est pas le but de ce tuto.

Le dossier template qui se trouve dans le dossier view contient du code réutilisé sur plusieurs pages de mon site, par exemple le header ou le footer. Vous pouvez aussi en créer d'éviter de dupliquer du code inutilement !

Le contenu du MVC

Je vais vous donner des exemples de ce que contient les models, views et controllers afin que vous sachiez ce qu'il faut, et ne faut pas mettre à l'intérieur.

Le Controller:

// Charger automatiquement les classes lors de l'instanciation
function chargerClasse($classname)
{
    if (file_exists('../model/'. ucfirst($classname).'.php')) {
        require '../model/'. ucfirst($classname).'.php';
    } elseif (file_exists('../entities/'. ucfirst($classname).'.php')) {
        require '../entities/'. ucfirst($classname).'.php';
    }
}
session_start();
spl_autoload_register('chargerClasse');
$db = Database::DB();
$messages = new MessagesManager($db);

// Code en PHP que vous souhaitez, vérification formulaire, utilisation des $_GET pour faire des requêtes, etc.

require "../views/indexVue.php";

$db sert à se connecter à la base de données. Lorsque ceci est fait, quand vous instancierez un model ou une entité, vous allez rentrer en paramètre votre $db afin que les requêtes se fassent.

La fonction chargerClasse appellera automatiquement les fichiers requis lorsque vous instancierez une méthode ou une classe. Par exemple : la variable $message instancie MessagesManager qui se trouve dans model, mais la function est appelée automatiquement et va vérifier dans le dossier model si un fichier messagesManager.php existe ; si oui il le require, si non il va vérifier dans mes entities, ça évite de devoir require manuellement chaque fichier et rend le code plus autonome.

Par la suite, je démarre ma session si j'en ai besoin, je me connecte à la base de données, et juste avant le require indexVue je peux rajouter tout le code php dont j'ai besoin.

/!\ Le require de l'index doit toujours se faire en dernier : n'oubliez pas que le code se lit de haut en bas /!\

La View:

<?php
include("template/header.php");
?>

<section class="chat">
  <div class="messages">
  </div>
  <div class="user-inputs">
    <form action="handler.php?task=write" method="post">
      <input type="text" name="author" id="author" placeholder="Nom">
      <input type="text" name="content" id="content" placeholder="Message..">
      <button type="submit">Envoyer</button>
    </form>
  </div>
</section>
<script src="../assets/js/main.js"></script>

<?php
include("template/footer.php");

Dans la view, comme je l'ai précédemment expliqué, je gère uniquement du HTML, des boucles, des if ayant pour but le visuel, ou tout ce qui y touche. Par exemple, j'include le header et le footer car je les ai volontairement mis dans un autre fichier afin de ne pas les dupliquer plusieurs fois inutilement. Ensuite à l'intérieur, rien de sorcier, je gère uniquement du HTML.

Le Model:

Vous devrez créer un fichier Database.php dans votre dossier model afin de gérer la connection à votre base de données, il contiendra quelque chose de similaire à ça :

<?php
class Database
{
    const HOST = "localhost",
          DBNAME = "messages",
          LOGIN = "root",
          PWD = '';

    public static function DB()
    {
        try {
            // évidemment cette partie dépend de votre propre base de données
            $db = new PDO('mysql:host=' . self::HOST . ';dbname=' . self::DBNAME . ';charset=utf8', self::LOGIN, self::PWD);
            return $db;
        } catch (Exception $e) {
            die('Erreur : '.$e->getMessage());
        }
    }
}

Lorsque ceci est fait, vous pouvez commencer à créer un manager (c'est un fichier se trouvant dans le dossier model), exemple MessagesManager.php.

<?php
class MessagesManager
{
    protected $_db;

    public function __construct(PDO $db)
    {
    	$this->setDb($db);
    }

    /**
    * get value of db
    *
    * @return self
    */
    public function getDb()
    {
    	return $this->_db;
    }

    /**
    * set value of db
    *
    * @param [PDO] $db
    * @return self
    */
    public function setDb(PDO $db)
    {
    	$this->_db = $db;
    	return $this;
    }

    /**
    * create message
    *
    * @param [Messages] $newMessage
    * @return self
    */
    public function postMessage(Messages $newMessage)
    {
    	$query = $this->getDb()->prepare('INSERT INTO messages(auteur, message) VALUES(:auteur, :message)');
        $query->bindValue('auteur', $newMessage->getAuteur(), PDO::PARAM_STR);
        $query->bindValue('message', $newMessage->getMessage(), PDO::PARAM_STR);
        $query->execute();
    }
}

Le Model se traduit par une Class, ce qui permet d'appeler différentes méthodes, tout en gardant en mémoire la connexion à la base de donnée. Ce code est orienté objet, donc si vous ne connaissez pas la POO, ne vous laissez pas intimider par getDB, setDB ou __construct !

La dernière fonction, permet d'exécuter une requête vers la base de données ! Le contenu de celle-ci peut évidemment être modifié comme vous le souhaitez par rapport à votre façon de faire une requête (même si je conseille de réaliser des requêtes préparées pour éviter les injections SQL).

Vous pouvez donc par la suite, créer une nouvelle méthode, par exemple getMessages(), qui à l'intérieur vous retournera les messages.

Comment aller sur le site ?

Vous devrez créer un fichier index.php à la racine de votre projet, comprenant:

<?php

header('Location: controllers/index.php');

 ?>

Afin de ne plus voir dans votre url "controllers/index.php" je vous conseille de vous renseigner sur le rewriteurl en php avec le .htaccess.

Je vous prépare un cours sur la POO et le rewriteurl afin que vous puissiez en savoir un peu plus sur tout ça !

En espérant que ce cours vous ai été utile ! Merci à vous.

Je suis disponible sur Discord si vous avez besoin de renseignement ou si certaines choses n'ont pas été comprises donc n'hésitez pas : Jessy#8047

Envie de lire la suite de ce tutoriel ?

Connecte-toi dès maintenant, et accède entièrement à tous les tutoriels de GCA !

#PHP

#POO

#dev

Écrit par Jessy#8047

5

Sommaire