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(). |
| Boot | Inicializace 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).
