Routing, neboli routování, můžeme definovat v rámci frameworku Laravel jako obousměrnou komunikaci mezi URL a kontrolery a tím vyvolat určitou akci.
Nejjednodušší Laravel routy jednoduše přijímají URI a closure a poskytují velmi jednoduché a expresivní metody pro definici routy:
Route::get('foo', function () {
return 'Hello World';
});
Všechny Laravel routy jsou definovány ve vašich routovacích souborech, které jsou umístěné v adresáři routes. Tyto
soubory jsou automaticky načteny frameworkem. Soubor routes/web.php
definuje routy, které slouží jako rozhraní pro
vaši aplikaci. Tyto routy jsou přiřazeny do middleware skupiny web, která nabízí funkce jako session nebo ochranu proti
CSRF. Routy v routes/api.php
patří do middleware skupiny api a jak už název napovídá, slouží pro definovaní API aplikace.
Ve většině aplikací začínáte definováním rout právě v souboru routes/web.php
.
Router umožňuje registrovat routy na základě HTTP metod:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Někdy budete potřebovat registrovat routu, která bude reagovat na více HTTP metod. Toho můžete dosáhnout s použitím
metody match
nebo můžete dokonce zaregistrovat routu, která bude reagovat na jakoukoliv HTTP metodu pomocí metody any
:
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('foo', function () {
//
});
Jakýkoliv HTML formulář, který odkazuje na POST
, PUT
nebo DELETE
routu definovanou v souboru web
, by měl
zahrnovat i pole s CSRF tokenem. Pokud token nebude obsahovat, pak bude požadavek odmítnut. Více o tom, co je CSRF a
jak se proti tomu více bránit můžete najít například na wikipedii.
Samozřejmě někdy potřebujete ve vaší routě zachytit i část segmentu URI. Například potřebujete dynamicky získat uživatelské ID z URL adresy. Toho můžete dosáhnout definováním parametru v routě:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Definovat pak můžete tolik parametrů, kolik jen vaše routa potřebuje:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
Parametry rout jsou vždy obaleny složenými závorkami {}
a měly by obsahovat alfabetické znaky. Parametry nesmí
obsahovat pomlčku, namísto toho použijte podtržítko _
.
Občas potřebujete specifikovat parametr routy, který ale nemusí být povinný. To můžete udělat tak, že za názvem parametru napíšete otazník. Je však důležité dbát na tom, aby byla definována i výchozí hodnota v proměnné routy:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
Formát vašeho parametru v routě můžete omezit použitím metody where, která akceptuje název parametru a regulární výraz.
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Pokud potřebujete aby parametr v routě byl vždy omezen daným regulárním výrazem, pak použijte metodu pattern. Tento vzor
definujte v metodě boot v souboru app/Providers/RouteServiceProvider.php
:
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
Jakmile je pak vzor definován, je automaticky aplikován na všechny routy, které využívají stejný název parametru:
Route::get('user/{id}', function ($id) {
// vykona se pouze pokud je {id} cislo...
});
Pojmenování rout umožňuje pohodlné generování URL adresa nebo přesměrování pro specifickou routu.
Route:get('auth/login')->name('auth.login');