Sobes.tech
Middle

Do czego służy middleware w aplikacjach?

sobes.tech AI

Odpowiedź od AI

Middleware w aplikacjach internetowych to oprogramowanie pośredniczące, które obsługuje żądania i odpowiedzi HTTP. Znajduje się pomiędzy serwerem internetowym a główną logiką aplikacji.

Główne zadania middleware:

  • Wstępne przetwarzanie żądania:
    • Uwierzytelnianie i autoryzacja użytkownika.
    • Parsowanie danych wejściowych żądania (JSON, XML itp.).
    • Walidacja danych żądania.
    • Logowanie żądań.
    • Dodawanie nagłówków do żądania.
  • Postprocesowanie odpowiedzi:
    • Modyfikacja odpowiedzi przed wysłaniem do klienta (np. dodanie nagłówków).
    • Kompresja odpowiedzi.
    • Obsługa błędów (wyjątki).
  • Zarządzanie przepływem wykonania: Middleware może przerwać obsługę żądania i zwrócić odpowiedź na wczesnym etapie (np. w przypadku braku uprawnień dostępu).

Zalety korzystania z middleware:

  • Modularność: Podział zadań na niezależne, wielokrotnego użytku komponenty.
  • Elastyczność: Łatwe dodawanie lub usuwanie funkcjonalności bez zmiany głównej logiki aplikacji.
  • Czytelność kodu: Poprawa struktury aplikacji poprzez wydzielenie operacji przekrojowych.
  • Testowalność: Pojedyncze middleware jest łatwiejsze do testowania w izolacji.

W frameworkach PHP (takich jak Laravel, Symfony, Slim) middleware często jest implementowane w formie klas, które implementują określony interfejs.

<?php

// Przykład struktury middleware (interfejs)
interface RequestHandlerInterface {
    public function handle(RequestInterface $request): ResponseInterface;
}

// Przykład implementacji middleware (uwierzytelnianie)
class AuthenticationMiddleware implements RequestHandlerInterface {
    public function handle(RequestInterface $request): ResponseInterface {
        // Sprawdzenie uwierzytelnienia
        if (!isAuthenticated()) {
            // Jeśli użytkownik nie jest uwierzytelniony, przerwij wykonanie i zwróć błąd
            return new Response(401, [], 'Unauthorized');
        }

        // Jeśli wszystko w porządku, przekazujemy żądanie do następnego obsługiwania (lub głównej logiki aplikacji)
        return $this->nextHandler->handle($request);
    }
}