Mapa adresářů Laravel 12: Co kam patří a proč
Zorientujte se v moderní zeštíhlené struktuře Laravelu 12, pochopte konec dřívějších Kernel tříd a osvojte si pravidla, kam v čisté architektuře patří modely, controllery, DTO a konfigurace.
Radikální zjednodušení v Laravelu 11 a 12
Pokud jste v minulosti pracovali se staršími verzemi Laravelu (verze 10 a dřívější), nový projekt v Laravelu 12 vás okamžitě překvapí svou čistotou a minimem souborů. Laravel prošel nejvýraznější redukcí adresářové struktury ve své historii:
- Zcela zmizely soubory
app/Http/Kernel.phpaapp/Console/Kernel.php. Veškerá konfigurace middleware, routování a plánovače úloh se nyní provádí funkcionálně a přehledně v souborubootstrap/app.php. - Složka
config/je téměř prázdná. Laravel 12 obsahuje ve výchozím stavu pouze ty konfigurační soubory, které vývojář explicitně publikoval. Všechny ostatní výchozí hodnoty si framework bere přímo ze svých interních balíčků. - Odstranění prázdných adresářů: Pokud v aplikaci nepotřebujete Channels, Events nebo Jobs, složky pro ně v
app/vůbec neexistují, dokud nespustíte příslušný Artisan generátor (make:event,make:job).
Anatomická mapa hlavních adresářů projektu
Podívejme se, jakou roli hrají jednotlivé složky v našem reálném projektu agy-laravel:
-
app/(Aplikační logika):Http/Controllers/: Tenké controllery odbavující HTTP požadavky.Http/Middleware/: Ochranné filtry požadavků (např.EnsureStudentProfile.php).Models/: Eloquent modely (CourseModule,CourseLesson,QuizQuestion,StudentProfile).Services/: Doménové služby (např.AnatomyInspectorService,StudentProgressService).Data/: Neměnná DTO pro bezpečný přenos dat (LessonContentData,AnatomyFileNodeData).Enums/: Nativní string-backed výčtové typy (LifecyclePhase,ModuleDifficulty).Livewire/: Reaktivní komponenty rozhraní (LessonQuiz,AnatomyExplorer).
-
bootstrap/(Inicializace frameworku):- Obsahuje soubor
bootstrap/app.php, kde se přesApplication::configure()konfigurují routy, middleware a zpracování výjimek. Dále složkubootstrap/cache/pro zkompilované manifesty služeb a rout.
- Obsahuje soubor
-
config/(Konfigurace):- Soubory jako
config/app.php,config/database.php. Všechny hodnoty jsou napojeny na proměnné prostředí přes funkcienv().
- Soubory jako
-
database/(Databázová vrstva):migrations/: Verzované schéma PostgreSQL tabulek.seeders/: Výchozí data (včetně modulů kurzu vseeders/Curriculum/).
-
public/(Jediný veřejný adresář):- Pouze
public/index.phpa vygenerované CSS/JS assety. Webserver nikdy nesmí mít přístup do kořenového adresáře!
- Pouze
-
resources/(Prezentace a zdrojové kódy frontendu):views/: Blade šablony a komponenty.css/ajs/: Vstupní soubory pro Vite compiler (Tailwind CSS, Alpine.js).
-
routes/(Směrování):routes/web.phppro webové rozhraní aroutes/console.phppro Artisan příkazy.
<?php
declare(strict_types=1);
use App\Http\Middleware\EnsureStudentProfile;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
// Ukázka moderního srdce konfigurace Laravelu 12 (bootstrap/app.php)
return Application::configure(basePath: dirname(__DIR__))
// 1. Fluentní registrace souborů rout a health-check endpointu
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
// 2. Náhrada za dřívější app/Http/Kernel.php: registrace middleware
->withMiddleware(function (Middleware $middleware): void {
$middleware->web(append: [
EnsureStudentProfile::class, // Náš middleware pro anonymní profil studenta
]);
})
// 3. Konfigurace zpracování výjimek
->withExceptions(function (Exceptions $exceptions): void {
// Zde lze definovat custom renderers a reporting pravidel
})->create();
🎯 Ověření znalostí z lekce
Kvíz otestuje pochopení architektury a reálného kódu probíraného v této lekci.
Kde se v moderním Laravelu 12 konfigurují globální a routové middleware namísto dřívějšího app/Http/Kernel.php?
Který adresář projektu musí být nastaven jako Document Root webového serveru (Caddy / FrankenPHP / Nginx)?
Jak Laravel 12 zachází s konfiguračními soubory v adresáři config/?
| 1 | { |
| 2 | "$schema": "https://getcomposer.org/schema.json", |
| 3 | "name": "laravel/laravel", |
| 4 | "type": "project", |
| 5 | "description": "The skeleton application for the Laravel framework.", |
| 6 | "keywords": ["laravel", "framework"], |
| 7 | "license": "MIT", |
| 8 | "require": { |
| 9 | "php": "^8.2", |
| 10 | "laravel/framework": "^12.0", |
| 11 | "laravel/tinker": "^2.10.1", |
| 12 | "livewire/livewire": "^3.0" |
| 13 | }, |
| 14 | "require-dev": { |
| 15 | "fakerphp/faker": "^1.23", |
| 16 | "laravel/pail": "^1.2.2", |
| 17 | "laravel/pint": "^1.24", |
| 18 | "laravel/sail": "^1.41", |
| 19 | "mockery/mockery": "^1.6", |
| 20 | "nunomaduro/collision": "^8.6", |
| 21 | "phpunit/phpunit": "^11.5.50" |
| 22 | }, |
| 23 | "autoload": { |
| 24 | "psr-4": { |
| 25 | "App\\": "app/", |
| 26 | "Database\\Factories\\": "database/factories/", |
| 27 | "Database\\Seeders\\": "database/seeders/" |
| 28 | } |
| 29 | }, |
| 30 | "autoload-dev": { |
| 31 | "psr-4": { |
| 32 | "Tests\\": "tests/" |
| 33 | } |
| 34 | }, |
| 35 | "scripts": { |
| 36 | "setup": [ |
| 37 | "composer install", |
| 38 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"", |
| 39 | "@php artisan key:generate", |
| 40 | "@php artisan migrate --force", |
| 41 | "npm install", |
| 42 | "npm run build" |
| 43 | ], |
| 44 | "dev": [ |
| 45 | "Composer\\Config::disableProcessTimeout", |
| 46 | "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others" |
| 47 | ], |
| 48 | "test": [ |
| 49 | "@php artisan config:clear --ansi", |
| 50 | "@php artisan test" |
| 51 | ], |
| 52 | "post-autoload-dump": [ |
| 53 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", |
| 54 | "@php artisan package:discover --ansi" |
| 55 | ], |
| 56 | "post-update-cmd": [ |
| 57 | "@php artisan vendor:publish --tag=laravel-assets --ansi --force" |
| 58 | ], |
| 59 | "post-root-package-install": [ |
| 60 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" |
| 61 | ], |
| 62 | "post-create-project-cmd": [ |
| 63 | "@php artisan key:generate --ansi", |
| 64 | "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"", |
| 65 | "@php artisan migrate --graceful --ansi" |
| 66 | ], |
| 67 | "pre-package-uninstall": [ |
| 68 | "Illuminate\\Foundation\\ComposerScripts::prePackageUninstall" |
| 69 | ] |
| 70 | }, |
| 71 | "extra": { |
| 72 | "laravel": { |
| 73 | "dont-discover": [] |
| 74 | } |
| 75 | }, |
| 76 | "config": { |
| 77 | "optimize-autoloader": true, |
| 78 | "preferred-install": "dist", |
| 79 | "sort-packages": true, |
| 80 | "allow-plugins": { |
| 81 | "pestphp/pest-plugin": true, |
| 82 | "php-http/discovery": true |
| 83 | } |
| 84 | }, |
| 85 | "minimum-stability": "stable", |
| 86 | "prefer-stable": true |
| 87 | } |
| 88 | |