Routing

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.

Základní routing

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ýchozí routovací soubor

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.

Routovací metody

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 () {
    //
});

Ochrana proti CSRF

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.

Parametry v routech

Povinné parametry

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 _.

Volitelné parametry

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;
});

Regulární výrazy v parametru

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]+']);

Globální omezení

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

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');