Les contenus du cours BRE03 Web Dev Course © 2024 par Mari Doucet sont sous licence CC BY-NC-SA 4.0
Le MVC (Model View Controller) est un design pattern, une architecture de code particulièrement adaptée au web.
Le MVC repose sur la stricte séparation entre les pages (View), les données (Models) et la logique (Controller).
Utilisé avec la POO, le MVC permet un code propre bien organisé, souple et plus facile à maintenir et faire évoluer.
Le fonctionnement typique de l’appel d’une page en MVC est donc le suivant :
index.php
reçoit la requête et instancie votre class Router
index.php
transmet la requête à votre Router
Router
vérifie si la route login
existe, et instancie le controlleur approprié (LoginController
)Router
appelle la méthode appropriée du controlleur : LoginController::login()
login
prépare le nom du template à charger et appelle layout.phtml
layout.phtml
appelle le template login.phtml
Une classe Model
est une classe qui représente une des tables de votre base de données. Chaque instance d’un Model
correspond à une ligne de la table correspondante.
Prenons l’exemple d’une classe qui représente un utilisateur :
class User
{
private ? int $id = null;
public function __construct(private string $email, private string $password){}
public function getId() : ? int
{
return $this->id;
}
public function setId(int $id) : void
{
$this->id = $id;
}
public function getEmail() : string
{
return $this->email;
}
public function setEmail(string $email) : void
{
$this->email = $email;
}
//...
}
Un Manager
est une classe qui va faire l’interface entre l’un de vos Model
et la base de données. On considère généralement qu’il y a un Manager
par Model
. Certains frameworks (dont Symfony) appellent les managers des Repository
.
Par défaut un managers doit permettre d’effectuer 5 actions et donc contenir 5 méthodes :
findAll()
qui récupère toute les données de la table et les retournent dans un tableau d’instances du Model
findOne(int $id)
qui récupère une ligne de la table et la retourne dans une instance du Model
create(Model $model)
qui créée le Model
reçu en paramètres dans la base de donnéesupdate(Model $model)
qui sauvegarde le Model
reçu en paramètres dans la base de donnéesdelete(Model $model)
qui supprime le Model
reçu en paramètresElle peut en contenir d’autres, si vous avez des requêtes que vous avez systématiquement besoin d’effectuer, par exemple trouver tous les Models
selon un critère autre que l’id.
Les views ce sont vos templates, donc vos fichiers .phtml
.
La structure de base de votre page avec les inclusions de vos CSS et JS se fait dans un fichier layout.phtml
qui lui-même appellera les bons templates en fonction de ce dont votre page a besoin.
Si vous avez deux interfaces différentes : par exemple un site et son interface d’administration, vous aurez deux layouts différents ci-besoin.
Vos Controllers
contiennent toute la logique de votre site.
En MVC, une route = une méthode de Controller
.
Un Controller
va généralement correspondre à une fonctionnalité.
Par exemple :
?route=login
et ?route=register
correspondront aux méthodes AuthController::login()
et AuthController::register()
respectivement.?route=list-users
et ?route=show-user
aux méthodes UserController::list()
et UserController::show()
respectivement.Une méthode de Controller
prépare les données pour l’affichage (en appelant un Manager
par exemple), précise au layout le template qui devra être appelé et traite les formulaires quand ils ont été soumis.
Le Router
est une classe donc le rôle est de faire correspondre les routes dans les URLs (?route=bidule
) à la bonne méthode de Controller
.
Si aucune méthode ne correspond, la route n’existe pas et il doit appeler une méthode de Controller
qui affichera une page 404.
Un Service
est une classe qui remplit une fonction précise et peut avoir besoin d’être appelée par plusieurs Controllers
différents.
Par exemple : une classe qui se charge d’envoyer des mails, ou une classe qui se charge d’uploader des fichiers.
- assets
- styles
- css
- scss
- js
- config
- Router.php
- autoload.php
- controllers
- models
- services
- templates
- layout.phtml
- index.php
À partir de ce point du cours, tous vos projets seront contenus dans des classes, vous devez donc utiliser des fichiers .php
au lieu de .class.php
pour écrire vos classes.
Le fichier autoload.php
vous sert à faire un require
de toutes vos classes, vous pouvez ensuite require
ce fichier en haut de votre index.php
et vos classes seront toujours disponibles.
Une fois que votre projet est en MVC, tous les require utilisent le chemin depuis l’index.php
parce qu’il devient votre unique point d’entrée (le seul fichier que vous allez run)
Consignes de l’exercice ici
Consignes de l’exercice ici