Skip to content

PSR-15 & Microframeworks (Slim, Mezzio) ​

O PSR-15 é o padrão oficial de Handlers e Middlewares HTTP utilizado por frameworks PHP modernos como Slim Framework, Mezzio e microserviços customizados.

Ao criar um Middleware PSR-15 simples, você protege qualquer aplicação compatível com PSR-15 em execução sob workers persistentes (FrankenPHP, RoadRunner, Swoole, ReactPHP) com zero complexidade.


Middleware PSR-15 do Leakless ​

Crie uma classe de middleware na sua aplicação:

php
<?php

declare(strict_types=1);

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use TheMattos\Leakless\DTOs\Config;
use TheMattos\Leakless\Leakless;

final class LeaklessMiddleware implements MiddlewareInterface
{
    private Leakless $guardian;

    public function __construct(?Config $config = null)
    {
        $this->guardian = new Leakless($config ?? new Config(
            maxDriftMb: 64,
            consecutiveViolationsThreshold: 5,
            checkTransactions: true,
            resettables: [
                // Registre seus serviços com estado ou callbacks de reset
                App\Services\CartSession::class,
                fn () => App\Legacy\UserStorage::$token = null,
            ],
        ));
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $this->guardian->startRequest();

        try {
            $response = $handler->handle($request);

            return $response;
        } finally {
            $report = $this->guardian->endRequest([
                'method' => $request->getMethod(),
                'uri' => (string) $request->getUri(),
            ]);

            if ($report->shouldRecycle) {
                // Finaliza o worker de acordo com o servidor
                if (function_exists('frankenphp_finish_request')) {
                    @frankenphp_finish_request();
                    exit(0);
                }
            }
        }
    }
}

Uso no Slim Framework ​

No bootstrap da sua aplicação Slim:

php
use Slim\Factory\AppFactory;
use App\Middleware\LeaklessMiddleware;
use TheMattos\Leakless\DTOs\Config;

$app = AppFactory::create();

// Adiciona o Leakless como o middleware mais externo
$app->add(new LeaklessMiddleware(new Config(
    maxDriftMb: 64,
    checkTransactions: true,
)));

$app->get('/api/health', function ($request, $response) {
    $response->getBody()->write(json_encode(['status' => 'saudavel']));
    return $response->withHeader('Content-Type', 'application/json');
});

$app->run();

Vantagens para Microframeworks ​

  • Sem dependência de framework: Funciona com qualquer roteador ou container compatível com PSR-7 e PSR-15.
  • Rollback Defensivo de Transações: Resgata transações PDO esquecidas independentemente da biblioteca de banco (PDO puro, Doctrine DBAL, Eloquent Capsule).
  • Zero Reflection no Ciclo de Requisição: Warmup compila todos os resetters, garantindo latências de microssegundos em microserviços de alto tráfego.

Released under the MIT License.