Lekce 2: Routing, controllery, middleware a makra
Vítejte u druhé lekce kurzu, která se zaměřuje na pokročilý routing a základní architekturu v Laravelu. Naučíte se, jak efektivně směrovat požadavky uživatelů, jak strukturovat kód pomocí controllerů a jak zabezpečit aplikace s pomocí middleware. Tato lekce vás provede od základů směrování až po pokročilé techniky, jako jsou makra.
Obsah lekce
- Definice rout GET/POST
- Parametry v routách (/products/{id})
- Vytvoření controlleru a jeho napojení na route
- Návrat JSON odpovědi
- Middleware – ukázka auth a jeho aplikace na route
- Vytvoření vlastního middleware
- Makro pro Collection a Route
- Shrnutí
Definice rout GET/POST
V Laravelu se routy definují v souborech ve složce routes. Nejčastěji se pracuje se soubory web.php pro webové rozhraní a api.php pro API.
GET route se používá pro získání dat z URL. Příklad:
Route::get('/produkty', function () {
// Vrací seznam produktů
});
POST route se používá pro odesílání dat, například z formulářů. Příklad:
Route::post('/produkty', function () {
// Ukládá nový produkt
});
Parametry v routách (/products/{id})
Parametry v routách vám umožní dynamicky zpracovávat požadavky na základě dat v URL. Příkladem je zobrazení detailu produktu s unikátním ID.
Route::get('/produkty/{id}', function ($id) {
return 'Zobrazuji produkt s ID: ' . $id;
});
Laravel podporuje také volitelné parametry, které se definují s otazníkem, např. /uzivatele/{id?}.
Vytvoření controlleru a jeho napojení na route
Pro lepší organizaci kódu se místo definování logiky přímo v routách používají controllery. Controller je třída, která sdružuje logiku pro zpracování souvisejících požadavků.
Vytvoření controlleru se provádí pomocí Artisan příkazu:
php artisan make:controller ProductController
Napojení controlleru na route se provádí pomocí pole [Třída::class, 'metoda'].
// routes/web.php
use App\Http\Controllers\ProductController;
Route::get('/produkty/{id}', [ProductController::class, 'show']);
Návrat JSON odpovědi
Pro API endpointy je běžné vracet data ve formátu JSON. Laravel to usnadňuje pomocí pomocné funkce response().
// app/Http/Controllers/ProductController.php
public function show($id)
{
$product = ['id' => $id, 'name' => 'Ukázkový produkt', 'price' => 100];
return response()->json($product);
}
Middleware – ukázka auth a jeho aplikace na route
Middleware v Laravelu funguje jako jakýsi "mezi-krok" mezi požadavkem a routerem. Umožňuje provést různé kontroly nebo akce, jako je ověření uživatele, ještě předtím, než se požadavek dostane k cílové logice.
Route::middleware('auth')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/nastaveni', [UserController::class, 'settings']);
});
Vytvoření vlastního middleware
Můžete si vytvořit vlastní middleware, například pro ověření uživatelské role.
Vytvořte middleware pomocí Artisanu:
php artisan make:middleware CheckAdmin
Upravte metodu handle() v nově vytvořeném souboru app/Http/Middleware/CheckAdmin.php.
// Zjednodušený příklad
public function handle(Request $request, Closure $next)
{
if (! $request->user() || ! $request->user()->isAdmin()) {
return redirect('/domu');
}
return $next($request);
}
Makro pro Collection a Route
Makra vám umožňují rozšířit funkčnost existujících tříd, jako jsou Collection a Route, o vlastní metody.
Makro pro Collection (např. sumWithTax)
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Collection;
public function boot()
{
Collection::macro('sumWithTax', function () {
return $this->sum(function ($item) {
return $item['price'] * 1.21;
});
});
}
Makro pro Route (např. Route::macro('admin', ...))
// app/Providers/RouteServiceProvider.php
use Illuminate\Support\Facades\Route;
public function boot()
{
Route::macro('admin', function ($prefix, $callback) {
Route::prefix('admin')->middleware('admin')->group($callback);
});
}
Shrnutí
Nyní rozumíte, jak v Laravelu efektivně definovat a směrovat požadavky. Zvládl jste základy práce s controllery a naučil se zabezpečit routy pomocí middleware. Díky makrům jste získal nástroj pro rozšíření frameworku dle svých potřeb, což povede k čistějšímu a udržitelnějšímu kódu. 🎉
´