CompiledHttpApp
Immutable, ready-to-serve PSR-15 request handler produced by HttpApp::compile().
What it does
CompiledHttpApp is the output of freezing an HttpApp DSL. It holds the fully
assembled middleware pipeline — exception handler, global middleware, and router —
compiled once at boot time. The handle() method dispatches that pipeline directly
with no per-request stack allocation, keeping the hot path as thin as possible.
Server adapters (Swoole HTTP server, Fiber-based development server, etc.) receive a
CompiledHttpApp instance and call handle(ServerRequestInterface $request) for
every incoming request. Application code never constructs this class directly; it is
always obtained via HttpApp::compile().
When an EventDispatcherInterface was supplied to HttpApp::create(), CompiledHttpApp
emits two PSR-14 lifecycle events per request:
RequestStarted— dispatched before the middleware chain is invoked.RequestCompleted— dispatched after the response is produced, carrying elapsed nanoseconds (measured withhrtime(true)).
When no dispatcher is configured the overhead is a single null identity check —
no allocation, no branching cost.
Example
use Monadial\Nexus\Http\Dsl\HttpApp;
use App\Handler\PingHandler;
use App\Handler\UserHandler;
use App\Middleware\AuthenticationMiddleware;
// Build and compile once at startup
$compiled = HttpApp::create($system, container: $container)
->get('/ping', PingHandler::class)
->get('/users/{id}', UserHandler::class)
->middleware(AuthenticationMiddleware::class)
->compile(); // <-- produces a CompiledHttpApp
// Swoole HTTP server adapter
$server->on('request', static function ($swooleReq, $swooleRes) use ($compiled): void {
$psrRequest = PsrFactory::fromSwoole($swooleReq);
$psrResponse = $compiled->handle($psrRequest);
// write $psrResponse headers and body back to $swooleRes …
});
$server->start();
Key methods
handle(ServerRequestInterface $request): ResponseInterface— dispatches the request through the compiled pipeline. ImplementsPsr\Http\Server\RequestHandlerInterface. EmitsRequestStartedandRequestCompletedPSR-14 events when a dispatcher is wired.
Immutability guarantee
CompiledHttpApp is declared final readonly. Once created it never changes: the
middleware pipeline, event dispatcher, and route table are fixed. This means the same
CompiledHttpApp instance can safely be shared across coroutines or fibers without
locking.
Full API reference
Full class hierarchy and method list
See also
- HTTP servers — Swoole and Fiber server adapter setup
- HttpApp — the DSL that produces
CompiledHttpAppviacompile()