Cesta HTTP požadavku: Od public/index.php přes bootstrap/app.php
Projděte si celou trajektorii HTTP požadavku krok za krokem: od zachycení webserverem FrankenPHP v public/index.php, přes inicializaci aplikace a middleware pipeline, až po vyhodnocení routy a sestavení Response.
Anatomie cesty požadavku (Request Lifecycle)
Každý požadavek na webovou stránku či API endpoint projde v Laravelu precizně definovaným životním cyklem. Podívejme se na jeho 7 klíčových fází:
[Klient / Prohlížeč]
│
▼ HTTP GET /moduly/moderni-php-84
[Webserver: FrankenPHP / Caddy]
│
▼
[public/index.php] ──▶ LARAVEL_START, Autoloader
│
▼
[bootstrap/app.php] ──▶ Vytvoření Application, konfigurace rout a middleware
│
▼
[Request::capture()] ──▶ Vytvoření Illuminate\Http\Request
│
▼
[Middleware Pipeline] ──▶ EnsureStudentProfile, Session, EncryptCookies
│
▼
[Router (routes/web.php)] ──▶ Matchování URL na Controller / Livewire
│
▼
[Controller / Action] ──▶ Spuštění byznys logiky, načtení z PostgreSQL
│
▼
[Blade View / Response] ──▶ Serializace do HTML / JSON
│
▼
[Odeslání odpovědi klientovi]
1. Vstupní bod: public/index.php
Celá magie začíná v jediném 22řádkovém souboru public/index.php:
- Časová značka:
define('LARAVEL_START', microtime(true));zaznamená přesný čas příchodu požadavku s mikrosekundovou přesností pro diagnostiku a profiling. - Režim údržby: Pokud existuje soubor
storage/framework/maintenance.php(vytvořený příkazemphp artisan down), server okamžitě vrátí maintenance stránku bez načítání celého frameworku. - Autoloading:
require __DIR__.'/../vendor/autoload.php';zaregistruje Composer autoloader, aby bylo možné instanciovat jakoukoliv třídu. - Bootstrap instance:
require_once __DIR__.'/../bootstrap/app.php';sestaví instanciIlluminate\Foundation\Application. - Odbavení:
$app->handleRequest(Request::capture());.
2. Zachycení požadavku: Request::capture()
Metoda Request::capture() převezme surová globální PHP pole ($_GET, $_POST, $_SERVER, $_COOKIE, $_FILES) a vytvoří z nich objektově orientovanou, bezpečnou a testovatelnou instanci třídy Illuminate\Http\Request.
Tento objekt je následně předán do metody handleRequest().
3. Průchod přes Middleware Pipeline (Cibulový model)
Předtím, než požadavek dorazí ke controlleru, musí projít řetězcem middleware vrstev. Fungují jako slupky cibule:
- Požadavek prochází vrstvami směrem dovnitř (např. kontrola údržby -> CORS -> ověření cookies -> start session -> náš vlastní
EnsureStudentProfile). - Pokud některý middleware rozhodne, že požadavek je neplatný (např. chybí autentizace nebo CSRF token), vytvoří chybovou odpověď a okamžitě tok přeruší (short-circuit).
- Když požadavek projde všemi vrstvami, Router najde příslušnou routu v
routes/web.phpa spustí controller. - Vygenerovaný objekt
Responseputuje zpět ven týmiž vrstvami, kde mohou middleware přidat hlavičky (např. bezpečnostní hlavičky, set-cookie) a odpověď je odeslána do sítě.
<?php
declare(strict_types=1);
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
// Reálný vstupní bod naší aplikace (public/index.php)
define('LARAVEL_START', microtime(true));
// 1. Rychlá kontrola režimu údržby před načtením frameworku
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;
}
// 2. Registrace PSR-4 autoloaderu vygenerovaného Composerem
require __DIR__.'/../vendor/autoload.php';
// 3. Inicializace Laravel Application instance
/** @var Application $app */
$app = require_once __DIR__.'/../bootstrap/app.php';
// 4. Zachycení HTTP vstupu ze superglobálních polí a spuštění pipeline
$app->handleRequest(Request::capture());
🎯 Ověření znalostí z lekce
Kvíz otestuje pochopení architektury a reálného kódu probíraného v této lekci.
K čemu slouží konstanta LARAVEL_START definovaná na prvním řádku public/index.php?
Co přesně provede volání Request::capture() v public/index.php?
Jak se chová Middleware Pipeline, pokud některý middleware vyhodnotí požadavek jako neoprávněný (např. chybějící oprávnění)?
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | |
| 5 | use Illuminate\Foundation\Application; |
| 6 | use Illuminate\Http\Request; |
| 7 | |
| 8 | define('LARAVEL_START', microtime(true)); |
| 9 | |
| 10 | // Determine if the application is in maintenance mode... |
| 11 | if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { |
| 12 | require $maintenance; |
| 13 | } |
| 14 | |
| 15 | // Register the Composer autoloader... |
| 16 | require __DIR__.'/../vendor/autoload.php'; |
| 17 | |
| 18 | // Bootstrap Laravel and handle the request... |
| 19 | /** @var Application $app */ |
| 20 | $app = require_once __DIR__.'/../bootstrap/app.php'; |
| 21 | |
| 22 | $app->handleRequest(Request::capture()); |
| 23 | |