Sobes.tech
Middle

Milleks kasutatakse middleware'i rakendustes?

sobes.tech AI

Vastus AI-lt

Vahe- ja rakendustes vaheline tarkvara veebirakendustes — see on vaheline tarkvara, mis töötleb HTTP-päringuid ja vastuseid. See asub veebiserveri ja rakenduse põhiloogika vahel.

Vahe- ja rakenduse tarkvara peamised ülesanded:

  • Päringu eelne töötlemine:
    • Kasutaja autentimine ja autoriseerimine.
    • Sissetulevate andmete analüüs (JSON, XML jne).
    • Päringu andmete valideerimine.
    • Päringute logimine.
    • Päiste lisamine päringule.
  • Vastuse järel töötlemine:
    • Vastuse muutmine enne saatmist kliendile (näiteks päiste lisamine).
    • Vastuse tihendamine.
    • Vigade töötlemine (erandid).
  • Jooksu voolu juhtimine: Vaheline tarkvara võib katkestada päringu töötlemise ja tagastada vastuse varases staadiumis (näiteks juurdepääsuõiguste puudumisel).

Vaheprogrammi kasutamise eelised:

  • Moodulaarne: ülesannete jagamine eraldi, taaskasutatavate komponentidena.
  • Paindlik: funktsionaalsuse lisamine või eemaldamine ilma põhiloogikat muutmata.
  • Koodi loetavus: programmi struktuuri parandamine, üldiste toimingute eraldamisega.
  • Testitavus: eraldi vaheline tarkvara on lihtne isoleeritult testida.

PHP raamistikus (näiteks Laravel, Symfony, Slim) realiseeritakse vaheline tarkvara sageli klassidena, mis implementeerivad kindlat liidest:

<?php

// Vaheprogrammi struktuuri näide (liides)
interface RequestHandlerInterface {
    public function handle(RequestInterface $request): ResponseInterface;
}

// Vaheprogrammi realiseerimine (autentimine)
class AuthenticationMiddleware implements RequestHandlerInterface {
    public function handle(RequestInterface $request): ResponseInterface {
        // Autentimise kontroll
        if (!isAuthenticated()) {
            // Kui kasutaja ei ole autentitud, katkestame ja tagastame vea
            return new Response(401, [], 'Unauthorized');
        }

        // Kui kõik on korras, edastame päringu järgmisele töötlejale (või põhiloogikale)
        return $this->nextHandler->handle($request);
    }
}