Rozdział 2 z 9

Kurs Laravel 13 #2: routing, trasy i parametry adresu

zweryfikowano 7 września 2026 · 5 min

Szybka odpowiedź

Trasy deklaruje się w routes/web.php zapisem Route::get('/chemin', [MonController::class, 'methode']). Nazywaj je przez ->name(), żeby budować odnośniki funkcją route('nom'), a nie na sztywno. Składnia z łańcuchem 'Controller@methode' nie działa od Laravela 8.

Na koniec tego rozdziału, będziesz umieć powiązać adres z kontrolerem, odczytać parametr z adresu URL, nazwać trasę i pozwolić Laravelowi wczytać model za ciebie.

Trasa wiąże adres z kodem. To brama wejściowa każdego żądania: Laravel odczytuje żądany adres URL, szuka pasującej trasy i wykonuje to, co ona wskazuje. Ten rozdział pokazuje cztery formy, jakie przybiera to powiązanie.

Najprostsza trasa

Wszystkie trasy publicznej części serwisu deklaruje się w routes/web.php. Oto zawartość tego pliku zaraz po instalacji:

routes/web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Ta trasa mówi: kiedy ktoś zażąda / metodą GET, zwróć widok welcome, czyli plik resources/views/welcome.blade.php.

Route::get() przyjmuje dwa argumenty: adres i to, co ma się wtedy stać. Ten drugi argument może mieć kilka postaci.

Zwrócenie łańcucha znaków

routes/web.php
Route::get('/bonjour', function () {
    return 'Bonjour !';
});

Wejdź na http://127.0.0.1:8000/bonjour: przeglądarka wyświetla czysty tekst. Przydaje się to do sprawdzenia, czy trasa w ogóle jest osiągana, rzadko do czegoś więcej.

Zwrócenie widoku

Żeby sprawdzić, że to właśnie welcome wyświetla się na stronie głównej, otwórz resources/views/welcome.blade.php i dodaj widoczną linię gdziekolwiek wewnątrz <body>:

resources/views/welcome.blade.php
<h1>Bonjour tout le monde !</h1>

Odśwież stronę główną: nagłówek się pojawia. Zmiana dotyczyła widoku, trasa pozostała nietknięta.

Wskazanie kontrolera

W prawdziwym projekcie logika nie mieszka w pliku tras, tylko w kontrolerze. Trasa ogranicza się wtedy do wskazania klasy i metody:

routes/web.php
use App\Http\Controllers\PostController;

Route::get('/article', [PostController::class, 'show']);

Tablica [PostController::class, 'show'] znaczy „wywołaj metodę show z klasy PostController”. Kontroler jeszcze nie istnieje: tworzy go kolejny rozdział. Zwróć uwagę na use na górze pliku, który importuje klasę. Bez niego PHP poszuka PostController w globalnej przestrzeni nazw i go nie znajdzie.

Składnia z nazwą w łańcuchu znaków już nie działa

Wiele kursów pisanych pod Laravela 7 i starsze wersje używa Route::get('/article', 'PostController@show'). Automatyczny prefiks przestrzeni nazw, który to umożliwiał, został usunięty w Laravelu 8. W Laravelu 13 taka trasa kończy się tym komunikatem:

code
Illuminate\Contracts\Container\BindingResolutionException
Target class [PostController] does not exist.

Laravel szuka klasy w korzeniu przestrzeni nazw zamiast w App\Http\Controllers. Zawsze używaj formy z tablicą.

Parametry w adresie URL

Blog potrzebuje adresów zmiennych: /article/mon-premier-article, /article/un-autre. Zmienna część staje się parametrem, zapisanym w klamrach:

routes/web.php
Route::get('/article/{slug}', function (string $slug) {
    return "Vous avez demandé l'article : {$slug}";
});

Laravel przechwytuje wszystko, co następuje po /article/, i przekazuje to funkcji pod nazwą $slug. Nazwa parametru w adresie i nazwa argumentu muszą się zgadzać.

Oczekiwaną postać można ograniczyć. Tutaj trasa odpowie tylko wtedy, gdy identyfikator jest liczbą:

routes/web.php
Route::get('/article/{id}', function (int $id) {
    return "Article numéro {$id}";
})->whereNumber('id');

Adres w rodzaju /article/bonjour zwróci wtedy błąd 404, zamiast trafić do twojego kodu z nieoczekiwaną wartością.

Nazwane trasy

Wpisywanie adresów na sztywno w szablonach jest kruche: w dniu, w którym zmienisz /article/ na /blog/, trzeba odnaleźć każdy odnośnik. Nazwanie trasy rozwiązuje ten problem:

routes/web.php
Route::get('/article/{slug}', [PostController::class, 'show'])->name('post');

Odnośnik buduje się wtedy z nazwy, nigdy z adresu:

php
route('post', ['slug' => 'mon-premier-article'])
// http://127.0.0.1:8000/article/mon-premier-article

W widoku Blade wygląda to tak:

markup
<a href="http://%20route('post',%20$post)%20">{{ $post->title }}</a>

Zmień adres w web.php, a wszystkie odnośniki pójdą za nim. Tak właśnie ten kurs buduje wszystkie swoje odnośniki, począwszy od rozdziału 7.

Wiązanie modelu z trasą

Laravel potrafi pójść dalej. Jeśli parametr nosi nazwę modelu, framework sam pobiera rekord:

routes/web.php
use App\Models\Post;

Route::get('/article/{post}', function (Post $post) {
    return $post->title;
});

Laravel odczytuje segment adresu, odpytuje tabelę posts i automatycznie zwraca błąd 404, jeśli nic nie pasuje. Dostajesz od razu obiekt, bez pisania zapytania. Domyślnie szuka po kolumnie id; rozdział 6 pokazuje, jak kazać mu szukać po kolumnie slug.

Wiązanie modelu oszczędza połowę zwyczajowego kodu kontrolera. W dalszej części kursu jest używane wszędzie.

Pozostałe metody HTTP

Route::get() obsługuje żądania odczytu. Do formularzy i API Laravel wystawia pozostałe metody:

php
Route::post('/article', [PostController::class, 'store']);
Route::put('/article/{post}', [PostController::class, 'update']);
Route::delete('/article/{post}', [PostController::class, 'destroy']);

Ten kurs korzysta wyłącznie z get: zapisy pójdą przez panel administracyjny zainstalowany w rozdziale 4.

Podgląd wszystkich tras

Ta komenda wypisuje to, co twoja aplikacja potrafi obsłużyć:

bash
php artisan route:list --except-vendor

W ukończonym projekcie z tego samouczka, po zainstalowaniu panelu administracyjnego z rozdziału 4, pokazuje też trasy back-office’u: deklarują je klasy z Twojego katalogu app/Filament, a nie sam pakiet. Aby zobaczyć tylko strony witryny, dodaj --except-path=admin:

bash
php artisan route:list --except-vendor --except-path=admin
code
  GET|HEAD       / .................................... home › IndexController
  GET|HEAD       article/{post} ................... post › PostController@show
  GET|HEAD       categorie/{category} .......... category › CategoryController
  GET|HEAD       etiquette/{tag} ......................... tag › TagController
  GET|HEAD       recherche .................... search › PostController@search

Opcja --except-vendor ukrywa trasy dodane przez zainstalowane pakiety, --except-path=admin pomija trasy panelu administracyjnego, które są jak najbardziej Twoje. To pierwsze polecenie do uruchomienia, gdy adres zwraca 404, choć wydawało Ci się, że go zadeklarowałeś.

Kolejny rozdział tworzy kontrolery i widoki, które te trasy wskazują.

Częste błędy

Target class [MonController] does not exist Składnia 'MonController@methode' nie jest wspierana od Laravela 8: Laravel szuka klasy w korzeniu przestrzeni nazw. Używaj formy [MonController::class, 'methode'] wraz z odpowiednim use.
Stała trasa przechwycona przez trasę z parametrem Laravel zatrzymuje się na pierwszej pasującej trasie. Zadeklaruj /recherche przed /{slug}, inaczej ta druga przechwyci tę pierwszą.
Zadeklarowana trasa i tak zwraca 404 Uruchom php artisan route:list --except-vendor, żeby zobaczyć, co aplikacja naprawdę potrafi obsłużyć.
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.