Middleware

Middlewary se spouští před routingem — mohou upravit request, nastavit jazyk, zkontrolovat oprávnění apod. Registrují se v bootstrap.php.

// bootstrap.php
$app->middlewares([
    \Moony\app\jobs\LanguageSetJob::class,
    \Moony\app\jobs\SomeOtherMiddleware::class,
]);

Vytvoření middleware

Middleware je třída s metodou invoke(). Může být statická nebo instanční.

namespace Moony\app\jobs;

class MaintenanceModeJob
{
    public function invoke(): void
    {
        if(config('maintenance')) {
            Response::send(new View('fallback/maintenance'));
        }
    }
}

Lifecycle

1.Framework se inicializuje (config, autoloader, debug)
2.Middlewary se spouští v pořadí registrace
3.Boot classes se spouští
4.Router matchne URL a zavolá controller
Pokud je metoda invoke() nestatická, instance třídy se přidá do DI kontejneru a je dostupná v dalších částech aplikace.

Boot Classes

Boot classes se spouští po middlewarech, před routingem. Slouží pro inicializaci služeb (session uživatele, obnovení stavu).

// bootstrap.php
$app->boot([
    \Moony\bootstrap\core\services\User::class,
]);

Vytvoření boot class

Boot třída má metodu boot(). Pokud je statická, zavolá se pouze metoda. Pokud ne, vytvoří se instance a přidá do DI.

class User
{
    // Statická boot metoda — obnoví session přihlášeného uživatele
    public static function boot(): void
    {
        if(strlen((string)Cookie::get('SESSION')) !== 64) {
            return;
        }

        // obnovení uživatelské session z cookie
    }
}

Middleware vs Boot

MiddlewareÚprava requestu, přesměrování, nastavení jazyka. Metoda invoke().
BootInicializace služeb, obnovení stavu (session, user). Metoda boot().

CSRF ochrana

Třída Moony\bootstrap\core\services\Csrf generuje a validuje CSRF tokeny (80 znaků hex). Token se ukládá do session.

Csrf::get()Vrátí aktuální token. Pokud neexistuje, vygeneruje nový.
Csrf::revoke()Zneplatní aktuální token (po úspěšné validaci POST)

V formulářích se vkládá automaticky přes {csrf}:

<form method="post">
    {csrf}
    <!-- inputs -->
</form>

Při Request::validate() se CSRF automaticky kontroluje. Pro přeskočení:

Request::validate($rules, true); // druhý parametr = skipCsrf
CSRF validace se automaticky přeskakuje u AJAX požadavků po úspěšné validaci (token se nerevokuje).