01 — Le Front Controller : public/index.php
Définition
Un Front Controller est un unique point d’entrée pour toutes les requêtes HTTP d’une application web. Au lieu d’avoir un fichier PHP par page (login.php, admin.php, etc.), une seule page reçoit tout et décide quoi faire.
🔗 Comparaison Laravel
Dans Laravel, le Front Controller est public/index.php. Il est identique dans son rôle au nôtre. C’est d’ailleurs une des conventions les plus importantes du framework.
| Notre blog | Laravel |
|---|---|
public/index.php |
public/index.php |
chdir(dirname(__DIR__)) |
Utilise __DIR__ pour localiser bootstrap/app.php |
require_once 'app/helpers.php' |
require __DIR__.'/../vendor/autoload.php' |
$router->resolve() |
$app->handleRequest(Request::capture()) |
📄 Notre fichier public/index.php
<?php
declare(strict_types=1);
session_start();
// On change le répertoire de travail vers la racine du projet
chdir(dirname(__DIR__));
// Permet de servir les fichiers statiques (CSS, Images)
$uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
if ($uri !== '/' && file_exists(__DIR__ . '/..' . $uri)) {
return false;
}
require_once 'app/helpers.php';
// Chargement des routes
$router = require_once 'routes/web.php';
// Résolution de la route
$router->resolve();
Analyse ligne par ligne
1. session_start()
Démarre la session PHP. Doit être appelé avant tout affichage HTML et avant toute logique.
En Laravel, la gestion de session est automatique grâce au middleware
StartSession.
2. chdir(dirname(__DIR__))
Change le répertoire de travail courant pour la racine du projet (le dossier parent de public/).
Sans cette ligne, tous les require_once 'app/...' échoueraient car PHP chercherait dans public/.
3. Détection des fichiers statiques
if ($uri !== '/' && file_exists(__DIR__ . '/..' . $uri)) {
return false;
}
Si la requête pointe vers un fichier qui existe physiquement (ex: /resources/css/blog.css), on retourne false pour laisser le serveur PHP intégré le servir directement.
En Laravel, les assets sont dans
public/et n’ont pas besoin de cette vérification.
4. require_once 'routes/web.php'
Charge le fichier de définition des routes. Ce fichier retourne l’instance du routeur configuré.
5. $router->resolve()
Lance la résolution de la route : analyse l’URL, trouve le contrôleur correspondant et l’exécute.
🛡️ Sécurité
Le fait d’utiliser public/ comme racine web signifie que les dossiers app/, database/, resources/, .env ne sont jamais accessibles directement via le navigateur. C’est la sécurité fondamentale du pattern Front Controller.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur 01 — Le Front Controller : `public/index.php`. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.