sabroan / psr-15
A lightweight PSR-15 server handler
1.0.0
2026-10-14 07:57 UTC
Requires
- php: >=8.5
- psr/http-message: ^2
- psr/http-server-handler: ^1
- psr/http-server-middleware: ^1
Requires (Dev)
- ergebnis/composer-normalize: ^2.54
- friendsofphp/php-cs-fixer: ^3.95
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.3
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-strict-rules: ^2.1
- phpunit/phpunit: ^13
- roave/security-advisories: dev-latest
- vimeo/psalm: ^7@beta
Suggests
None
Provides
Conflicts
None
Replaces
None
README
A lightweight PSR-15 implementation for PHP 8.5+.
Features
- Supports variadic and named middleware arguments.
- Immutable readonly handler with no state changes during execution.
- Supports cloning to reset the pipeline in long-running workers like RoadRunner or Swoole.
Requirements
PHP 8.5 or later
Installation
Install the package using Composer:
composer require sabroan/psr-15
Usage
Create a request handler by passing one or more PSR-15 middleware instances:
<?php declare(strict_types=1); use Sabroan\Http\RequestHandler; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; $middleware = new class implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler, ): ResponseInterface { return $handler->handle($request); } }; $handler = new RequestHandler($middleware); /** @var ServerRequestInterface $request */ $response = $handler->handle($request);
Resetting a handler with cloning
In long-running applications, such as RoadRunner or Swoole workers, you can clone a handler to reset index without reconstructing the middleware pipeline:
<?php declare(strict_types=1); use OpenSwoole\Core\Psr; use OpenSwoole\Http\Request; use OpenSwoole\Http\Response; use OpenSwoole\Http\Server; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Sabroan\Http\RequestHandler; $middleware = new class implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler, ): ResponseInterface { return $handler->handle($request); } }; $handler = new RequestHandler($middleware); $server = new Server("127.0.0.1", 9501); $server->on("start", function (Server $server) { echo "OpenSwoole http server is started at http://127.0.0.1:9501\n"; }); $server->on("request", function (Request $request, Response $response) { $psrRequest = Psr\ServerRequest::from($request); $psrResponse = (clone $handler)->handle($psrRequest); Psr\Response::emit($response, $psrResponse); }); $server->start();
Cloning resets the handler but reuses the same middleware instances, so ensure middleware does not retain request-specific state between requests.
License
This package is released under the MIT License. See the LICENSE file for details.