Skip to content

Middleware Package

PSR-15 middleware pipeline.

Installation

bash
composer require lighthouse/middleware

Basic Usage

php
use Lighthouse\Middleware\Pipeline;

$pipeline = new Pipeline();

$pipeline->pipe(new AuthMiddleware());
$pipeline->pipe(new LoggingMiddleware());

$response = $pipeline->handle($request);

Creating Middleware

Implement MiddlewareInterface:

php
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class LoggingMiddleware implements MiddlewareInterface
{
    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
    ): ResponseInterface {
        // Before
        $start = microtime(true);

        // Call next
        $response = $handler->handle($request);

        // After
        $duration = microtime(true) - $start;
        error_log("Request took {$duration}s");

        return $response;
    }
}

Callable Middleware

php
$pipeline->pipe(function ($request, $handler) {
    $response = $handler->handle($request);
    return $response->withHeader('X-Powered-By', 'Lighthouse');
});

Fallback Handler

Set the final handler:

php
$pipeline->fallback(new class implements RequestHandlerInterface {
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        return new Response(404);
    }
});

Short-Circuiting

Return early without calling the next handler:

php
class AuthMiddleware implements MiddlewareInterface
{
    public function process($request, $handler): ResponseInterface
    {
        if (!$this->isAuthenticated($request)) {
            return new Response(401);  // Stop here
        }

        return $handler->handle($request);  // Continue
    }
}

Modifying Request

Pass data downstream via attributes:

php
public function process($request, $handler): ResponseInterface
{
    $user = $this->getUser($request);
    $request = $request->withAttribute('user', $user);

    return $handler->handle($request);
}

Access later:

php
$user = $request->getAttribute('user');

PSR-15 Compliance

  • PipelineRequestHandlerInterface
  • Middleware → MiddlewareInterface

Released under the MIT License.