Blok 1 · rozdział 1
Projekt Korona i po co Laravel
Przez te 40 godzin robisz jedną aplikację: Korona Gór Polski. Użytkownik zakłada konto i zapisuje szczyty, na których był. Laravel daje na to gotowe katalogi i polecenia, więc nie zaczynasz każdej strony od pustego pliku PHP.
Po tym rozdziale powinieneś umieć
- opisać, co użytkownik robi w gotowej aplikacji;
- wymienić, które problemy framework rozwiązuje za Ciebie (trasy, widoki, baza, konto);
- rozpisać otwarcie karty Rysów na trasę, kontroler, model i widok;
- powiedzieć, czego na tym kursie nie instalujemy: Reacta, Vue i Inertii.
1. Co budujemy
Korona Gór Polski to lista 28 szczytów — po jednym z pasma — opisana w 1997 roku przez Marka Więckowskiego i Wojciecha Lewandowskiego. Najwyższy jest Rysy (2499 m), najniższy na liście kursowej to Łysica (614 m). Kto zbierze wszystkie, „zamyka koronę”.
Aplikacja ma cztery ekrany:
- Lista szczytów — nazwa, pasmo, wysokość, od najwyższego.
- Karta szczytu — jeden szczyt i formularz „byłem tutaj”.
- Konto — rejestracja, logowanie, wylogowanie.
- Moja Korona — ile szczytów już masz, np. 6/28, i których brakuje.
materialy/korona.php, żeby w grupie były te same rekordy.
2. Framework a własny PHP
W PAI układasz pliki sam: formularz, include, tablica $_POST,
czasem PDO i password_hash. Przy drugiej i trzeciej stronie
wracają te same kawałki: połączenie z bazą, sprawdzenie logowania, ochrona przed wklejonym HTML-em.
Framework to gotowy szkielet aplikacji. Laravel przynosi katalogi, polecenia
php artisan, zapis tras, widoki Blade i dostęp do bazy przez klasy (Eloquent).
Nadal piszesz PHP, tylko powtarzalne rzeczy wywołujesz po nazwie, a nie kopiujesz z poprzedniego zadania.
| Zadanie | Czysty PHP z PAI | Na tym kursie |
|---|---|---|
| Adres strony | Osobny plik, np. szczyt.php?id=3 |
Trasa w routes/web.php, np. /szczyty/rysy |
| HTML | echo pomieszany z kodem |
Widok Blade w resources/views |
| Baza | SQL w stringu, PDO | Model Eloquent: Szczyt::orderByDesc('wysokosc_m')->get() |
| Konto | Własna sesja i password_hash |
Breeze generuje rejestrację i logowanie (blok 4) |
| Szukanie bez przeładowania całej strony | Własny JavaScript | Livewire: logika zostaje w PHP (blok 5) |
3. MVC w Laravelu
MVC dzieli aplikację na trzy części: model, widok i kontroler. W Laravelu przed nimi jest jeszcze trasa. Do skrótu jej nie wliczamy. Trasa wskazuje tylko, która metoda kontrolera obsłuży dany adres.
Szczyt czyta wiersz z tabeli i wie, do jakiego pasma należy.
Nie składa strony i nie sprawdza, jaki adres wpisał użytkownik.
Jedno otwarcie karty, krok po kroku
Użytkownik klika „Rysy”. Przeglądarka wysyła żądanie GET /szczyty/rysy. Dalej dzieje się to po stronie serwera, zanim cokolwiek wróci na ekran.
-
Trasa. Laravel czyta
routes/web.phpi szuka wpisu naGET /szczyty/{szczyt}. Znajduje wskazanie: klasaSzczytController, metodashow. -
Kontroler. Metoda
showdostaje fragment adresurysy. Nie skleja SQL-a w widoku. Prosi model o ten jeden szczyt. -
Model. Klasa
Szczytczyta z MySQL wiersz, którego slug torysy, razem z pasmem (Tatry) i wysokością. Gdy wiersza nie ma, Laravel kończy kodem 404. Do przeglądarki nie idzie pusta karta. -
Kontroler jeszcze raz. Dostaje obiekt szczytu i wybiera widok
szczyty.show. Przekazuje mu ten obiekt. Sam nie pisze nagłówków HTML. -
Widok Blade. Wstawia nazwę, pasmo i wysokość w miejsca
{{ }}. Laravel zamienia plik Blade na HTML. -
Przeglądarka. Dostaje gotową stronę. W źródle widać HTML. Nie widać klasy
Szczyt, treści.envani zapytania do bazy.
Podział obowiązków
| Trasa | Kontroler | Model | Widok | |
|---|---|---|---|---|
| Wie o adresie | tak | dostaje go od trasy | nie | nie |
| Czyta i zapisuje wiersze | nie | prosi o to model | tak | nie |
| Składa HTML | nie | wybiera plik widoku | nie | tak |
| Plik w projekcie | routes/web.php |
app/Http/Controllers |
app/Models |
resources/views |
To samo przy zapisie zdobycia
Klik „Zapisz zdobycie” wysyła inne żądanie: POST /szczyty/rysy/zdobycia.
Trasa wskazuje inną metodę. Kontroler sprawdza datę i to, czy użytkownik jest zalogowany.
Model dopisuje wiersz w tabeli zdobycia. Pole user_id bierze z sesji, a nie z ukrytego pola formularza.
Po udanym zapisie kontroler przekierowuje na kartę szczytu, a widok pokazuje komunikat „zapisano”.
W bloku 1 modelu jeszcze nie ma
W rozdziałach 3–6 lista szczytów jest jeszcze zwykłą tablicą PHP. Trasa i widok działają tak samo jak później.
Od bloku 2 między trasą a widokiem staje kontroler.
Od bloku 3 tablicę zastępuje model Szczyt i tabela w MySQL.
Widok czyta wtedy $szczyt->nazwa, a nie $szczyt['nazwa'].
Wysokość poprawiasz w bazie. W pliku Blade jej już nie zmieniasz.
4. Pięć bloków
| Blok | Co robisz | Skąd bierze się lista szczytów |
|---|---|---|
| 1 | Instalacja, trasy, Blade | tablicy PHP w kodzie |
| 2 | Kontroler, układ, komponent, formularz | tej samej tablicy, już przez kontroler |
| 3 | Migracje, modele, seeder | bazy MySQL |
| 4 | Breeze i zdobycia | bazy; zapis jest przypisany do konta |
| 5 | Livewire i domknięcie | bazy; szukanie bez nowego pliku JS |
Tablica z bloku 1 jest tymczasowa. W bloku 3 ją usuwasz. Jeśli zostawisz i tablicę, i bazę, poprawisz wysokość w phpMyAdmin, a strona i tak pokaże starą wartość z kodu.
5. Dane, które zapiszemy
pasma
Nazwa, np. Tatry. Jeden wiersz na pasmo.
1 : N
szczyty
Nazwa, slug, wysokość. Klucz obcy do pasma.
users
Konto z Breeze: imię, e-mail, hasło.
N : M
przez zdobycia
szczyty
Ten sam szczyt może mieć wielu zdobywców.
Tabela zdobycia trzyma datę i notatkę, więc to nie jest pusta tabela łącząca.
Znasz ten układ z BD: związek wiele-do-wielu z własnymi atrybutami.