Fáze požadavku: 1. Vstupní bod (public/index.php)
Modul 2 · Lekce 2

Cesta HTTP požadavku: Od public/index.php přes bootstrap/app.php

💡 Shrnutí lekce

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:

  1. Časová značka: define('LARAVEL_START', microtime(true)); zaznamená přesný čas příchodu požadavku s mikrosekundovou přesností pro diagnostiku a profiling.
  2. Režim údržby: Pokud existuje soubor storage/framework/maintenance.php (vytvořený příkazem php artisan down), server okamžitě vrátí maintenance stránku bez načítání celého frameworku.
  3. Autoloading: require __DIR__.'/../vendor/autoload.php'; zaregistruje Composer autoloader, aby bylo možné instanciovat jakoukoliv třídu.
  4. Bootstrap instance: require_once __DIR__.'/../bootstrap/app.php'; sestaví instanci Illuminate\Foundation\Application.
  5. 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.php a spustí controller.
  • Vygenerovaný objekt Response putuje 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ě.
💻 Klíčová konstrukce z praxe
<?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.

Otázka 1 z 3

K čemu slouží konstanta LARAVEL_START definovaná na prvním řádku public/index.php?

Otázka 2 z 3

Co přesně provede volání Request::capture() v public/index.php?

Otázka 3 z 3

Jak se chová Middleware Pipeline, pokud některý middleware vyhodnotí požadavek jako neoprávněný (např. chybějící oprávnění)?

Zodpovězeno: 0 / 3
🔬 Živá anatomie v této aplikaci
3 soubory
Na co se v kódu zaměřit: V souboru public/index.php si všimni elegantního řádku $app->handleRequest(Request::capture()). V routes/web.php prozkoumej definici trasy /moduly/{module:slug}/lekce/{lesson:slug}, kam směrují požadavky studentů na detail lekce.
cesta: public/index.php
22 řádků · 0.6 KB
Vstupní bod HTTP požadavku pro FrankenPHP webserver; inicializuje Composer autoloader a načítá bootstrap aplikace.
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
cesta: bootstrap/app.php
23 řádků · 0.7 KB
Nové jádro Laravel 12 pro registraci webových i konzolových rout, middleware pipeline a zachytávání výjimek bez Http Kernelu.
1 <?php
2
3 declare(strict_types=1);
4
5 use App\Http\Middleware\EnsureStudentProfile;
6 use Illuminate\Foundation\Application;
7 use Illuminate\Foundation\Configuration\Exceptions;
8 use Illuminate\Foundation\Configuration\Middleware;
9
10 return Application::configure(basePath: dirname(__DIR__))
11 ->withRouting(
12 web: __DIR__.'/../routes/web.php',
13 commands: __DIR__.'/../routes/console.php',
14 health: '/up',
15 )
16 ->withMiddleware(function (Middleware $middleware): void {
17 $middleware->web(append: [
18 EnsureStudentProfile::class,
19 ]);
20 })
21 ->withExceptions(function (Exceptions $exceptions): void {
22 //
23 })->create();
24
cesta: routes/web.php
29 řádků · 1.1 KB
Definice webových tras, Route Model Binding pro moduly a lekce, mapování na Controllery a API status endpoint.
1 <?php
2
3 declare(strict_types=1);
4
5 use App\Http\Controllers\AnatomyController;
6 use App\Http\Controllers\CourseController;
7 use App\Models\CourseLesson;
8 use App\Models\CourseModule;
9 use Illuminate\Http\JsonResponse;
10 use Illuminate\Support\Facades\Route;
11
12 Route::get('/', [CourseController::class, 'index'])->name('course.index');
13 Route::get('/anatomie', [AnatomyController::class, 'index'])->name('anatomy.index');
14
15 Route::post('/profil/prenosovy-kod', [CourseController::class, 'switchProfile'])->name('course.switch-profile');
16
17 Route::get('/moduly/{module:slug}', [CourseController::class, 'module'])->name('course.module');
18 Route::get('/moduly/{module:slug}/lekce/{lesson:slug}', [CourseController::class, 'lesson'])->name('course.lesson');
19
20 Route::get('/api/status', function (): JsonResponse {
21 return response()->json([
22 'app' => config('app.name'),
23 'php_version' => PHP_VERSION,
24 'laravel_version' => app()->version(),
25 'modules_count' => CourseModule::count(),
26 'lessons_count' => CourseLesson::count(),
27 'status' => 'ok',
28 ]);
29 })->name('api.status');
30
Zdroj: skutečné soubory této aplikace Plný průzkumník anatomie →