Zpět na kurz

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

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

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

David Kojecký

David Kojecký

Programátor ve společnosti Codefit a vývojář pro Mobilní lékárna CZ

´