5. Le contrôleur principal 🚦⚓︎
Jusqu'ici, chaque contrôleur était étudié individuellement. Dans une application MVC réelle, il existe un contrôleur principal (ou front controller) qui sert de point d'entrée unique : toutes les requêtes passent par lui, et c'est lui qui délègue le traitement au bon contrôleur.
Dans notre application, ce rôle est joué par index.php + controleurPrincipal.php.
1. Analyse du fonctionnement du contrôleur principal 🔍⚓︎
1.1 Analyse de l'existant 🔎⚓︎
Documents à utiliser : fichiers du projet, annexes 1, 2 et 3
Annexe 1 - index.php 📄
<?php
include "getRacine.php";
include "$racine/controleur/controleurPrincipal.php";
include_once "$racine/modele/authentification.inc.php";
if (isset($_GET["action"])) {
$action = $_GET["action"];
}
else {
$action = "defaut";
}
$fichier = controleurPrincipal($action);
include "$racine/controleur/$fichier";
?>
Annexe 2 - controleurPrincipal.php 📄
<?php
function controleurPrincipal($action) {
$lesActions = array();
$lesActions["defaut"] = "listeRestos.php";
$lesActions["liste"] = "listeRestos.php";
$lesActions["detail"] = "detailResto.php";
$lesActions["recherche"] = "rechercheResto.php";
$lesActions["connexion"] = "connexion.php";
$lesActions["deconnexion"] = "deconnexion.php";
$lesActions["profil"] = "monProfil.php";
if (array_key_exists($action, $lesActions)) {
return $lesActions[$action];
}
else {
return $lesActions["defaut"];
}
}
?>
Annexe 3 - extrait de la documentation PHP 📄
array_key_exists (PHP 4 >= 4.0.7, PHP 5, PHP 7)
array_key_exists — Vérifie si une clé existe dans un tableau
Description : array_key_exists ( mixed $key , array $array ) : bool
array_key_exists() retourne TRUE s'il existe une clé du nom de key dans le tableau array. key peut être n'importe quelle valeur valide d'index de tableau.
Liste de paramètres
key Valeur à vérifier.
array Un tableau contenant les clés à vérifier.
Valeurs de retour Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient.
Rappel : transmission en méthode GET
Les paramètres GET sont visibles dans l'URL :
http://serveur/dossier/index.php?action=connexion
Dans cet exemple : le paramètre action a la valeur connexion.
❓ Naviguer successivement sur les écrans de connexion, recherche et accueil. Relever les URL et compléter le tableau : 📨
| Écran | URL complète | Paramètre GET | Valeur |
|---|---|---|---|
| Connexion | |||
| Recherche | |||
| Accueil |
Éléments de réponses ✅
| Écran | URL complète | Paramètre GET | Valeur |
|---|---|---|---|
| Connexion | http://serveur/resto/?action=connexion |
action |
connexion |
| Recherche | http://serveur/resto/?action=recherche |
action |
recherche |
| Accueil | http://serveur/resto/?action=accueil |
action |
accueil |
❓ Valeurs possibles de$action 🔎
Le fichier index.php reçoit tous les paramètres GET :
if (isset($_GET["action"])) {
$action = $_GET["action"];
} else {
$action = "defaut";
}
$fichier = controleurPrincipal($action);
include "$racine/controleur/$fichier";
À l'aide de l'annexe 1 et de la réponse à la question précédente, indiquer les valeurs que peut prendre la variable $action.
Éléments de réponses ✅
La variable $action peut prendre les valeurs suivantes : "defaut", "recherche", "accueil" et "connexion" (et toutes les autres actions définies dans $lesActions).
❓ Structure de $lesActions 🗺️
La fonction controleurPrincipal() (annexe 2) :
function controleurPrincipal($action) {
$lesActions = array();
$lesActions["defaut"] = "listeRestos.php";
$lesActions["liste"] = "listeRestos.php";
$lesActions["detail"] = "detailResto.php";
$lesActions["recherche"] = "rechercheResto.php";
$lesActions["connexion"] = "connexion.php";
$lesActions["deconnexion"] = "deconnexion.php";
$lesActions["profil"] = "monProfil.php";
if (array_key_exists($action, $lesActions)) {
return $lesActions[$action];
} else {
return $lesActions["defaut"];
}
}
Schématiser la structure de la variable $lesActions :
$lesActions
├── "defaut" → "listeRestos.php"
├── "liste" → "listeRestos.php"
├── ...
Éléments de réponses ✅
$lesActions (tableau associatif)
├── "defaut" → "listeRestos.php"
├── "liste" → "listeRestos.php"
├── "detail" → "detailResto.php"
├── "recherche" → "rechercheResto.php"
├── "connexion" → "connexion.php"
├── "deconnexion" → "deconnexion.php"
└── "profil" → "monProfil.php"
❓ Quelle partie de la structure $lesActions est similaire aux données trouvées en question 1.1 ? 🔗
Éléments de réponses ✅
Les clés du tableau associatif $lesActions ("connexion", "recherche", "accueil"…) sont similaires aux valeurs du paramètre action transmises dans les URL en méthode GET. C'est bien l'action reçue qui sert de clé pour retrouver le fichier contrôleur à charger.
❓ À partir des questions précédentes, indiquer quelles valeurs peuvent être transmises à la fonction controleurPrincipal() 📋
Éléments de réponses ✅
Les valeurs pouvant être transmises correspondent aux clés du tableau $lesActions :
"defaut", "liste", "detail", "recherche", "connexion", "deconnexion", "profil".
❓ Pour chaque valeur transmise, indiquer quelle valeur sera retournée : 📋
Valeur de $action |
Valeur retournée |
|---|---|
"liste" |
"listeRestos.php" |
"connexion" |
|
"detail" |
|
"recherche" |
|
"profil" |
|
"defaut" |
Éléments de réponses ✅
Valeur de $action |
Valeur retournée |
|---|---|
"liste" |
"listeRestos.php" |
"connexion" |
"connexion.php" |
"detail" |
"detailResto.php" |
"recherche" |
"rechercheResto.php" |
"profil" |
"monProfil.php" |
"defaut" |
"listeRestos.php" |
❓ Que se passe-t-il si l'action transmise n'existe pas dans $lesActions ? Quelle valeur est retournée ? 🤔
Éléments de réponses ✅
Lorsque l'action transmise n'existe pas dans $lesActions, le bloc else est exécuté et la fonction retourne $lesActions["defaut"], c'est-à-dire "listeRestos.php". L'utilisateur voit donc la liste des restaurants par défaut.
❓ Expliquer l'utilité de la condition utilisant array_key_exists() dans la fonction. 🤔
Documentation PHP :
array_key_exists(mixed $key, array $array) : bool
Retournetruesi la clé$keyexiste dans le tableau$array.
Éléments de réponses ✅
array_key_exists() permet de vérifier si l'action demandée existe dans le tableau $lesActions avant d'y accéder. Sans cette vérification, accéder à une clé inexistante ($lesActions["actionInexistante"]) générerait un avertissement PHP et retournerait null. La fonction protège ainsi contre les URL mal formées ou les tentatives d'accès à des actions non définies.
❓ Quel script contrôleur est appelé par index.php lorsque la variable GET action n'est pas renseignée ? 🔎
Éléments de réponses ✅
Lorsque action n'est pas renseignée, index.php affecte "defaut" à $action. La fonction controleurPrincipal("defaut") retourne "listeRestos.php" : c'est la liste des restaurants qui s'affiche.
❓ Quel script contrôleur est appelé par index.php lorsque action vaut "liste" ? 🔎
Éléments de réponses ✅
Lorsque action vaut "liste", la fonction retourne "listeRestos.php" — même résultat que "defaut", car les deux clés pointent vers le même fichier contrôleur.
1.2 Le contrôleur principal 📌⚓︎
La variable $lesActions contient l'ensemble des contrôleurs accessibles sur le site. Chaque clé correspond à un script contrôleur.

🔨 Ajouter une nouvelle fonctionnalité
Pour intégrer une nouvelle fonctionnalité, il faut :
- Créer le contrôleur dans le dossier
controleur/ - Créer la vue dans le dossier
vue/ - Créer les fonctions modèle si nécessaire dans
modele/ - Déclarer l'action dans
controleurPrincipal():$lesActions['uneAction'] = "scriptControleur.php"; - Créer le lien pointant vers la nouvelle action :
<a href="./?action=uneAction">Lien vers la fonctionnalité</a>
⚠️ Règle importante : Les contrôleurs ne sont jamais appelés directement dans l'URL. On passe toujours par index.php et le paramètre action.
Exemple avec connexion :


Dans l'exemple ci dessus, le nom du fichier index.php n'est pas visible, on peut soit l'indiquer, soit faire référence à l'emplacement "/" qui désigne le fichier index.php dans la configuration du serveur web Apache .
Les contrôleurs ne sont jamais directement appelés dans l'URL, on doit toujours passer par le contrôleur principal, et donc par index.php. Il en est de même avec les formulaires, comme celui de connexion.

On remarque que les données du formulaire sont transmises en méthode POST à index.php. Lors de l'inclusion du fichier contrôleur (connexion.php), ces données seront aussi accessibles dans le contrôleur.
Pour intégrer une nouvelle fonctionnalité au site web, il faut donc :
- créer un nouveau contrôleur dans le dossier approprié,
- créer la vue et le modèle associé si besoin,
- ajouter une action dans la variable $lesActions associant le nom de l'action au nom du script contrôleur,
- donner l'accès à ce contrôleur par l'intermédiaire d'un lien ou d'un formulaire transmettant l'action en méthode GET.
2. Intégration de contrôleurs pré-existants 🔧⚓︎
2.1 CGU (Conditions Générales d'Utilisation) 📜⚓︎
Documents à utiliser : fichiers du projet, annexe 4
Annexe 4 - extrait du fichier entete.html.php 📄
<ul id="menuGeneral">
<li><a href="./?action=accueil">Accueil</a></li>
<li><a href="./?action=recherche"><img src="images/rechercher.png" alt="loupe" />Recherche</a></li>
<li></li>
<li id="logo"><a href="./?action=accueil"><img src="images/logoBarre.png" alt="logo" /></a></li>
<li></li>
<li><a href="./?action=cgu">CGU</a></li>
<?php if(isLoggedOn()){ ?>
<li><a href="./?action=profil"><img src="images/profil.png" alt="loupe" />Mon Profil</a></li>
<?php }
else{ ?>
<li><a href="./?action=connexion"><img src="images/profil.png" alt="loupe" />Connexion</a></li>
<?php } ?>
</ul>
Les conditions générales d'utilisations ont déjà été écrites. La vue et le contrôleur associés sont disponibles. De même, le menu général propose un lien vers celles ci.
Lorsque l'on clique sur ce lien les CGU ne sont pas affichées, le contrôleur par défaut est chargé à la place.
❓ Repérer dans le menu général l'**action correspondant au contrôleur des CGU.** 🔎
Éléments de réponses ✅
Dans le menu général, le lien vers les CGU est :
<li><a href="./?action=cgu">CGU</a></li>
"cgu".
❓ Placer les fichiers fournis en ressource dans les dossiers appropriés (controleur/ et vue/). 📁
Éléments de réponses ✅
cgu.php→ dossiercontroleur/vueCgu.php→ dossiervue/
❓ Rédiger l'instruction à ajouter dans controleurPrincipal() pour intégrer les CGU :✏️
$lesActions["___"] = "___";
Éléments de réponses ✅
$lesActions["cgu"] = "cgu.php";
controleurPrincipal(), juste après les autres initialisations de $lesActions.
❓ Ajouter la nouvelle action à la fonction, puis tester le lien CGU dans le menu. 🧪
2.2 Aimer un restaurant ⭐⚓︎
Documents à utiliser : fichiers du projet, annexe 5
Annexe 5 - contrôleur aimer.php 📄
<?php
if ($_SERVER["SCRIPT_FILENAME"] == __FILE__) {
$racine = "..";
}
include_once "$racine/modele/bd.aimer.inc.php";
// recuperation des donnees GET, POST, et SESSION
$idR = $_GET["idR"];
// appel des fonctions permettant de recuperer les donnees utiles a l'affichage
$mailU = getMailULoggedOn();
if ($mailU != "") {
$aimer = getAimerById($mailU, $idR);
// traitement si necessaire des donnees recuperees
;
if ($aimer == false) {
addAimer($mailU, $idR);
} else {
delAimer($mailU, $idR);
}
}
// redirection vers le referer
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
Lorsqu'un utilisateur connecté consulte la fiche descriptive d'un restaurant, il a la possibilité d'ajouter celui-ci dans la liste des restaurants qu'il aime. Cette action se fait en cliquant sur l'étoile située à droite du nom du restaurant. Tant que l'utilisateur n'a pas aimé ce restaurant, l'étoile est grisée.

Lorsqu’on clique sur ce lien, le traitement n'est pas effectué, rien n'est enregistré dans la table aimer. Le contrôleur par défaut est chargé à la place.
❓ Quelle vue permet d'afficher la fiche descriptive d'un restaurant ? 🖼️
Éléments de réponses ✅
Le fichier vueDetailResto.php permet d'afficher la fiche descriptive d'un restaurant.
❓ Repérer dans le code de la vue le lien correspondant à l'étoile ⭐.
Éléments de réponses ✅
<?php if ($aimer != false) { ?>
<a href="./?action=aimer&idR=<?= $unResto['idR']; ?>">
<img class="aimer" src="images/aime.png" alt="j'aime ce restaurant">
</a>
<?php } else { ?>
<a href="./?action=aimer&idR=<?= $unResto['idR']; ?>">
<img class="aimer" src="images/aimepas.png" alt="je n'aime pas encore ce restaurant">
</a>
<?php } ?>
❓ Quels sont les paramètres envoyés en méthode GET lors du clic sur l'étoile ? Préciser le nom et la valeur de chaque paramètre.📨
| Paramètre | Valeur |
|---|---|
Éléments de réponses ✅
| Paramètre | Valeur |
|---|---|
action |
"aimer" |
idR |
identifiant du restaurant affiché (ex: 7) |
❓ À partir du script contrôleur fourni, déterminer dans quels scripts sont utilisées les deux variables transmises en GET. 🔎
Éléments de réponses ✅
- Le paramètre
actionest utilisé parindex.phppour sélectionner le contrôleur à charger. - Le paramètre
idRest utilisé par le contrôleuraimer.phppour savoir quel restaurant l'utilisateur souhaite aimer.
🔨 Placer le fichier contrôleur fourni dans le dossier approprié. 📁
Éléments de réponses ✅
aimer.php est un fichier contrôleur → il doit être placé dans le dossier controleur/.
🔨 Rédiger l'instruction à ajouter dans controleurPrincipal() pour la nouvelle action "aimer" : ✏️
$lesActions["___"] = "___";
Éléments de réponses ✅
$lesActions["aimer"] = "aimer.php";
🔨 Ajouter la nouvelle action, puis tester en cliquant sur l'étoile (vous devez être authentifié). 🧪
🔨 Le contrôleur aimer.php fait-il appel à une vue ?🖼️
Éléments de réponses ✅
Non. Le contrôleur aimer.php ne contient aucune inclusion de vue. Il effectue l'action (enregistrer le "j'aime" en base), puis redirige l'utilisateur vers la page précédente.
❓ Le referer HTTP 🌐
En fin de contrôleur se trouve cette instruction :
header('Location: ' . $_SERVER['HTTP_REFERER']);
🔎 Rechercher la signification du terme referer en HTTP.
Pour comprendre son fonctionnement :
- Commenter l'instruction
header()ci-dessus - Afficher à la place la valeur de
$_SERVER['HTTP_REFERER'] - Tester l'action d'aimer sur un restaurant
Éléments de réponses ✅
Le referer (ou referrer) HTTP est l'URL de la page sur laquelle se trouvait le lien qui a mené à la page actuelle. C'est le navigateur qui transmet cette information au serveur dans l'en-tête HTTP Referer.
❓ Que contient la variable $_SERVER['HTTP_REFERER'] ? 🔎
Éléments de réponses ✅
La variable contient l'URL de la fiche restaurant que l'on consultait, par exemple [http://serveur/resto/?action=detail&idR=7]
❓ Déduire de vos observations le rôle de header('Location: ' . $_SERVER['HTTP_REFERER']); 🤔
Éléments de réponses ✅
Cette instruction redirige le navigateur vers la page précédente (la fiche du restaurant). Ainsi, après avoir cliqué sur l'étoile, l'utilisateur revient automatiquement sur la fiche du restaurant, sans que la page change visuellement — seule l'étoile change d'état.
2.3 Inscription 📝⚓︎
Le formulaire d'inscription est accessible par l'intermédiaire d'un lien dans la section "connexion" du site.
❓ Analyser le lien d'inscription, puis apporter les modifications nécessaires pour rendre l'inscription fonctionnelle.✏️
🚩 Le modèle, la vue et le contrôleur sont déjà disponibles. Reprendre la même logique que pour les exercices précédents :
- Identifier l'action dans le lien
- Placer les fichiers dans les bons dossiers
- Ajouter l'action dans
controleurPrincipal()- Tester
Éléments de réponses ✅
- Le lien d'inscription utilise l'action
"inscription". - Placer les fichiers :
inscription.php→ dossiercontroleur/vueInscription.php→ dossiervue/
- Ajouter dans
controleurPrincipal():🐘 PHP$lesActions["inscription"] = "inscription.php"; - Tester en cliquant sur le lien "Inscription" dans la page de connexion.
3. Bilan de la série de TP 🏆⚓︎
Download zip du projet Resto ⤵️
Vous avez maintenant étudié et manipulé les 4 composants d'une application MVC en PHP :
| Composant | Fichiers | Rôle |
|---|---|---|
| Contrôleur principal | index.php, controleurPrincipal.php |
Point d'entrée, routage |
| Contrôleur | controleur/*.php |
Logique applicative, coordination |
| Vue | vue/*.php |
Affichage HTML |
| Modèle | modele/bd.*.inc.php |
Accès aux données (PDO) |
Flux complet d'une requête