Framework et librairie
Bloc Laravel · séance 1 · ~30 min
Quand vous créez une application web, vous devez souvent reconnaître l'adresse demandée, lire des données et produire du HTML. Vous devez aussi empêcher le navigateur d'exécuter le texte saisi par un utilisateur. Cette protection s'appelle l'échappement HTML.
Une bibliothèque fournit des fonctions que votre programme utilise à des endroits précis. Un framework contient le programme de démarrage de l'application. Quand le navigateur demande une page, ce programme lit l'adresse et exécute la méthode enregistrée pour cette adresse. Dans chacun des quatre programmes étudiés, vous pouvez repérer le fichier qui contient l'instruction d'appel.
À la fin de ce chapitre, vous serez capables de :
- distinguer une bibliothèque d'un framework en répondant à la question « qui appelle qui ? »
- expliquer comment Laravel lance une méthode de votre code
- citer ce qu'un framework vous fait gagner et ce qu'il vous fait perdre
- situer Laravel parmi les principaux frameworks web de 2026
1. Le problème : une page de blog à la main
Cette petite application de blog tient dans un seul fichier, index.php. Elle affiche la liste des articles à l'adresse /posts. Pour toute autre adresse, elle renvoie une erreur 404.
<?php
// 1. La base de données, ici en mémoire
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE posts (id INTEGER PRIMARY KEY, title TEXT)');
$pdo->exec("INSERT INTO posts (title) VALUES ('Bienvenue sur le blog'), ('<script>alert(1)</script>')");
// 2. Le routage : quelle URL a été demandée ?
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path === '/posts') {
$posts = $pdo->query('SELECT title FROM posts ORDER BY id DESC')->fetchAll();
echo '<h1>Articles</h1>', PHP_EOL;
foreach ($posts as $post) {
// 3. L'échappement HTML
echo '<p>', htmlspecialchars($post['title']), '</p>', PHP_EOL;
}
} else {
http_response_code(404);
echo 'Page introuvable', PHP_EOL;
}
Lancez-la avec le serveur intégré de PHP, puis ouvrez http://127.0.0.1:8080/posts dans le navigateur.
php -S 127.0.0.1:8080 index.php
Le navigateur affiche un titre et deux paragraphes. Il les obtient en envoyant une requête, c'est-à-dire une demande adressée au serveur. Cette demande contient une méthode HTTP, un mot qui indique l'action voulue, comme GET. Elle contient aussi un chemin, comme /posts. Le serveur renvoie une réponse composée d'un code, comme 200 ou 404, et d'un contenu.
Pour lire le HTML reçu par le navigateur, ouvrez un second terminal et utilisez curl, un programme qui envoie une requête. Il affiche la réponse sans la transformer en page. L'option -i ajoute les en-têtes, des lignes qui décrivent la réponse. Elles contiennent notamment le code 404 Not Found. Sous PowerShell, tapez curl.exe :
$ curl http://127.0.0.1:8080/posts
<h1>Articles</h1>
<p><script>alert(1)</script></p>
<p>Bienvenue sur le blog</p>
$ curl -i http://127.0.0.1:8080/contact
HTTP/1.1 404 Not Found
Host: 127.0.0.1:8080
Date: Sat, 26 Sep 2026 14:18:07 GMT
Connection: close
X-Powered-By: PHP/8.4.21
Content-type: text/html; charset=UTF-8
Page introuvable
Le routage associe l'adresse demandée au code qui doit produire la réponse. Ici, la condition if ($path === '/posts') réalise cette association. L'échappement transforme ensuite <script> en <script>. Le navigateur affiche donc ce texte au lieu de l'exécuter comme une balise.
Ce fichier fonctionne tant que le site ne contient qu'une page. Avec vingt pages, la condition devient une suite de elseif qu'il faut modifier pour chaque nouvelle adresse.
Une application doit souvent conserver l'identité de la personne connectée entre deux requêtes. Une session enregistre cette information sur le serveur. Il faut également refuser les formulaires envoyés depuis un autre site et préparer l'envoi des courriels. Sans outil commun, vous devez remettre en place ces mécanismes dans chaque projet.
2. La bibliothèque : vous l'appelez
Une bibliothèque rassemble des classes et des fonctions écrites par d'autres personnes. Votre programme utilise seulement celles dont il a besoin. Le mot « librairie » est aussi employé, par calque de l'anglais library.
Afficher une date sous la forme « mercredi 23 septembre 2026 » ou « il y a trois jours » demande plusieurs opérations. La bibliothèque Carbon fournit les méthodes qui lisent, traduisent et mettent en forme cette date. Un paquet est un ensemble de fichiers PHP distribué sous un même nom. Composer est le programme qui installe les paquets demandés par un projet. Dans un dossier vide, utilisez-le pour installer Carbon :
composer require nesbot/carbon
./composer.json has been created
Running composer update nesbot/carbon
Loading composer repositories with package information
Updating dependencies
Lock file operations: 7 installs, 0 updates, 0 removals
- Locking carbonphp/carbon-doctrine-types (3.2.1)
- Locking nesbot/carbon (3.14.0)
…
Generating autoload files
6 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^3.14 for nesbot/carbon
Le signe … remplace les lignes intermédiaires de la sortie. Composer a installé sept paquets, car Carbon en utilise cinq et l'un de ces paquets en utilise un autre. Un paquet nécessaire au fonctionnement d'un programme s'appelle une dépendance. Composer installe Carbon ainsi que toutes les dépendances indiquées par ces paquets.
Écrivez ensuite dates.php à côté du dossier vendor :
<?php
require __DIR__ . '/vendor/autoload.php';
use Carbon\Carbon;
$publishedAt = Carbon::parse('2026-09-23 09:00');
echo $publishedAt->locale('fr_BE')->isoFormat('dddd D MMMM YYYY'), PHP_EOL;
echo $publishedAt->locale('fr_BE')->diffForHumans(), PHP_EOL;
$ php dates.php
mercredi 23 septembre 2026
il y a 3 jours
La méthode diffForHumans() compare la date enregistrée à la date du jour. La seconde ligne change donc selon le jour où vous lancez le script.
PHP exécute dates.php de haut en bas. À la ligne qui contient Carbon::parse(...), il utilise la méthode fournie par Carbon et place la date obtenue dans $publishedAt. Les deux lignes suivantes utilisent encore Carbon pour mettre cette date en forme. Si vous retirez ces appels, aucune méthode de Carbon n'est exécutée. Une bibliothèque fournit donc du code que votre programme utilise aux endroits choisis.
3. Le framework : il vous appelle
Un contrôleur est une classe dont les méthodes préparent la réponse à une adresse. Vous avez déjà rencontré ce contrôleur dans le bloc POO :
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\View\View;
class PostController extends Controller
{
public function index(): View
{
$posts = Post::latest()->get();
return view('posts.index', ['posts' => $posts]);
}
}
Ce contrôleur déclare la méthode index(), mais aucun fichier de votre projet ne contient new PostController() suivi de ->index(). Quand le navigateur demande /posts, Laravel effectue ces deux opérations. Il obtient le nom de la classe et celui de la méthode dans la route enregistrée par routes/web.php.
Le modèle Post est une classe qui représente les articles enregistrés dans la table posts. Cette table contient les deux mêmes articles. Une vue est un fichier qui produit le HTML envoyé au navigateur. resources/views/posts/index.blade.php est une version courte de la vue que vous écrirez au chapitre MVC :
<h1>Articles</h1>
@foreach ($posts as $post)
<p>{{ $post->title }}</p>
@endforeach
Dans cette vue, les doubles accolades {{ }} appliquent l'échappement HTML au titre de chaque article. Le projet s'appelle premier-test-laravel. Herd ou Laragon rend ce projet accessible à l'adresse premier-test-laravel.test. La commande curl http://premier-test-laravel.test/posts envoie une requête et affiche le HTML reçu :
$ curl http://premier-test-laravel.test/posts
<h1>Articles</h1>
<p><script>alert(1)</script></p>
<p>Bienvenue sur le blog</p>
La réponse contient le même HTML qu'à la section 1, avec le même échappement. Votre code ne contient pourtant ni condition sur l'adresse ni création d'un objet PDO.
L'association entre l'adresse et la méthode se déclare dans routes/web.php. La première ligne importe la classe PostController. La seconde indique que le chemin /posts doit être traité par sa méthode index().
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);
Artisan est l'outil en ligne de commande de Laravel, présenté au chapitre Installation. php artisan route:list --path=posts affiche la route enregistrée pour le chemin /posts :
$ php artisan route:list --path=posts
GET|HEAD posts .................................. PostController@index
Showing [1] routes
Quand Laravel reçoit une requête pour /posts, il cherche ce chemin dans les routes enregistrées. La route contient PostController::class et index. Laravel crée donc un objet PostController, exécute sa méthode index() et transforme la valeur renvoyée en réponse pour le navigateur.
Dans framework.php, la fonction run() reproduit trois opérations de Laravel : chercher une route, créer le contrôleur indiqué et appeler sa méthode.
<?php
// Le « framework » : écrit une fois, par quelqu'un d'autre
function run(array $routes, string $path): void
{
if (!isset($routes[$path])) {
echo 'Page introuvable', PHP_EOL;
return;
}
[$class, $method] = $routes[$path];
$controller = new $class();
echo $controller->$method(), PHP_EOL;
}
La fonction run() reçoit la liste des routes et le chemin demandé. Si ce chemin ne figure pas dans $routes, elle affiche Page introuvable et s'arrête.
Pour /posts, l'instruction [$class, $method] = $routes[$path]; copie les deux valeurs de la route dans deux variables. $class contient alors le nom PostController, tandis que $method contient le nom index.
L'instruction new $class() crée ensuite un objet de la classe nommée dans $class. Enfin, $controller->$method() exécute sur cet objet la méthode nommée dans $method. PHP permet donc d'utiliser des variables pour indiquer la classe à créer et la méthode à exécuter.
Le fichier app.php contient le code que vous écririez dans l'application : le contrôleur et la liste des routes. Pour simuler l'adresse demandée dans un navigateur, le script lit $argv[1], le premier argument écrit après php app.php. Avec php app.php /posts, cette variable contient donc /posts.
<?php
require __DIR__ . '/framework.php';
// Votre code : une classe, une méthode, une table des routes
class PostController
{
public function index(): string
{
return 'Liste des articles';
}
}
$routes = ['/posts' => [PostController::class, 'index']];
run($routes, $argv[1]);
$ php app.php /posts
Liste des articles
$ php app.php /contact
Page introuvable
Astuce
Sans argument, $argv[1] n'existe pas : tapez php app.php /posts.
Votre fichier déclare PostController, sa méthode index() et la route associée à /posts. La fonction run() reçoit ensuite le chemin demandé. Pour /posts, elle crée un PostController et appelle index(). L'instruction qui lance la méthode se trouve donc dans le framework, tandis que la classe et la route se trouvent dans votre code.
Avec une bibliothèque, votre script commence par une instruction que vous avez écrite, comme Carbon::parse(). Avec Laravel, le point de départ se trouve dans le framework. Lorsqu'une requête arrive pour /posts, Laravel consulte la route, crée un PostController, puis exécute sa méthode index().
Vous écrivez donc la route et la méthode, mais pas l'instruction qui appelle index(). Cette organisation s'appelle l'inversion de contrôle. À l'intérieur de index(), votre code utilise ensuite des fonctions de Laravel, comme view(), de la même manière qu'il utiliserait une bibliothèque.

Note
En 1985, Richard Sweet décrit ce renversement par une formule de Hollywood : « Ne nous appelez pas, c'est nous qui vous appellerons ». C'est la réponse faite aux acteurs après une audition. En anglais, on parle depuis du « principe d'Hollywood ».
4. Ce que ça change pour vous
Pour charger une classe ou une vue, Laravel construit son emplacement à partir de règles connues. Ces règles s'appellent des conventions : le framework fixe à l'avance les noms et les dossiers habituels. Vous n'avez donc pas à indiquer séparément chaque emplacement.
Laravel place les contrôleurs dans app/Http/Controllers, les modèles dans app/Models et les vues dans resources/views. Il associe aussi le modèle Post à la table posts en appliquant une règle de pluriel anglais.
Ce que vous gagnez :
- Le framework fournit les mécanismes communs. Ses classes gèrent notamment le routage, les sessions, la protection des formulaires et l'envoi de courriels.
- Les projets emploient les mêmes dossiers. Dans un autre projet Laravel, vous chercherez encore les contrôleurs dans
app/Http/Controllers. - Certaines protections s'appliquent automatiquement. Les doubles accolades de la vue échappent le HTML sans appel direct à
htmlspecialchars(), comme le montre la sortie de la section 3.
Ce que vous perdez :
- Le déroulement est plus difficile à suivre. Dans
index.php, vous lisez toutes les instructions dans leur ordre. Pour afficher/posts, Laravel charge environ trois cents classes, dont quatre seulement se trouvent dans vos fichiers. En cas d'erreur, vous devez repérer vos fichiers parmi ceux que le message affiche. - Votre code doit respecter les conventions. Si le nom ou le dossier d'un fichier ne correspond pas à la règle attendue, Laravel ne charge pas l'élément concerné. Le message d'erreur n'indique pas toujours quelle convention a été enfreinte.
- Le projet doit suivre les versions du framework. Laravel publie une version majeure par an et fournit les correctifs de sécurité pendant deux ans. Vous devez donc adapter le projet à une nouvelle version au moins tous les deux ans.
5. Panorama 2026
Plusieurs langages proposent des frameworks web. Sur le serveur, ces frameworks reçoivent la requête envoyée par le navigateur et produisent la réponse.
| Nom | Langage | Depuis | Une phrase |
|---|---|---|---|
| Laravel | PHP | 2011 | Le framework de ce cours, qui fournit de nombreux réglages par défaut. |
| Symfony | PHP | 2005 | Un framework PHP né en France, qui permet de déclarer précisément sa configuration. |
| Django | Python | 2005 | Un framework né dans la rédaction d'un journal américain, qui fournit les outils principaux d'une application. |
| Ruby on Rails | Ruby | 2004 | Le framework qui a popularisé les noms et les dossiers fixés par défaut plutôt que leur configuration séparée. |
| Express | JavaScript (Node.js) | 2010 | Un framework centré sur le serveur et le routage, auquel vous ajoutez les autres outils nécessaires. |
| Next.js | JavaScript (Node.js) | 2016 | Un framework construit autour de React, capable de produire des pages sur le serveur. |
| Spring | Java | 2002 | Un framework Java utilisé notamment dans les grandes entreprises. |
| ASP.NET Core | C# | 2016 | Le framework web de Microsoft, réécrit pour tourner hors de Windows. |
Un composant est une partie d'interface réutilisable, comme un bouton ou une carte d'article. Dans le navigateur, plusieurs outils construisent l'interface en exécutant le code de ces composants.
| Nom | Langage | Depuis | Une phrase |
|---|---|---|---|
| React | JavaScript | 2013 | Créé chez Facebook, il se présente comme une bibliothèque et non comme un framework. |
| Vue | JavaScript | 2014 | Un framework souvent associé à Laravel, que vous pouvez ajouter à une partie seulement d'une page. |
| Angular | TypeScript | 2016 | Un framework de Google qui a remplacé AngularJS. |
| Svelte | JavaScript | 2016 | Un framework qui transforme les composants en code JavaScript avant leur exécution dans le navigateur. |
Le nom donné à un outil ne suffit pas toujours pour le classer. Avec React, vous écrivez des composants, puis React exécute leur code pour produire l'interface. React se présente malgré tout comme une bibliothèque, car il n'organise pas à lui seul toute l'application. Next.js ajoute notamment les routes, le démarrage du serveur et des règles pour organiser les fichiers. Il remplit donc le rôle d'un framework.
Le paquet laravel/framework déclare onze paquets Symfony parmi ses dépendances, dont symfony/routing et symfony/http-foundation. Il utilise aussi trois polyfills, des paquets qui apportent à une ancienne version de PHP une fonction plus récente. Laravel utilise Carbon pour les dates.
Un framework utilise donc souvent plusieurs bibliothèques. Il ajoute un programme de démarrage et des conventions qui déterminent le code à exécuter pour chaque requête.
À retenir
- Une bibliothèque fournit des fonctions que votre programme exécute à des endroits précis.
- Un framework reçoit la demande du navigateur, consulte la route et exécute la méthode indiquée.
- Pour distinguer les deux outils, repérez le code qui contient l'instruction d'appel.
- Les conventions associent des noms et des types de fichiers à des dossiers fixés par Laravel.
- Pour
/posts, la route fournit à Laravel la classePostControlleret la méthodeindex.
Exercices
1. Bibliothèque ou framework ?
Sur papier, classez ces huit outils. Pour chacun, écrivez une phrase qui nomme le code exécuté et l'instruction qui déclenche son exécution.
- Carbon
- Laravel
- PHPMailer, qui envoie des courriels depuis un script PHP
- Django
league/csv, qui lit et écrit des fichiers CSV- Pest
- Symfony
- React
Indice pour Pest : vous écrivez test('…', function () { … }). Cherchez quel programme exécute la fonction transmise à test(). Pour React, relisez la section 5.
2. Qui écrit, qui appelle ?
Reprenez le PostController de la section 3 et la ligne de routes/web.php. Pour chaque instruction, indiquez qui l'écrit, puis quel programme l'exécute et à quel moment.
Route::get('/posts', [PostController::class, 'index']);class PostController extends Controllerpublic function index(): View$posts = Post::latest()->get();return view('posts.index', ['posts' => $posts]);
Une instruction écrite dans votre fichier peut être exécutée par Laravel. Une déclaration de classe n'est pas une action. Pour cette ligne, indiquez quel code crée l'objet avec new. Comparez vos réponses avec framework.php et app.php de la section 3.