A clean, modern, and dependency-free PHP 8.2+ HTTP abstraction package for Request, Response, HeaderBag, MiddlewarePipeline, and more.

Maintainers

Package info

github.com/lukman-ss/http

pkg:composer/lukman-ss/http

Statistics

Installs: 4

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-06-13 07:24 UTC

This package is auto-updated.

Last update: 2026-06-13 07:36:44 UTC


README

lukman-ss/http Hero Image

A clean, modern, and dependency-free PHP 8.2+ HTTP abstraction package.

Requirements

  • PHP 8.2 or higher
  • No runtime dependencies

Installation

composer require lukman-ss/http

Request

use Lukman\Http\Request;

$request = new Request(
    method: 'POST',
    uri: '/api/users?page=2',
    query: ['page' => '2'],
    request: ['name' => 'Lukman', 'email' => 'lukman@example.com'],
    headers: ['Content-Type' => 'application/json'],
    body: '{"name":"Lukman"}',
);

$request->method();         // 'POST'
$request->uri();            // '/api/users?page=2'
$request->path();           // '/api/users'
$request->isMethod('post'); // true

$request->query('page');    // '2'
$request->query();          // ['page' => '2']
$request->input('name');    // 'Lukman'
$request->input();          // ['name' => 'Lukman', 'email' => 'lukman@example.com']

$request->json('name');     // 'Lukman'
$request->json();           // ['name' => 'Lukman']

$request->all();             // ['name' => 'Lukman', 'email' => 'lukman@example.com']
$request->only(['name']);    // ['name' => 'Lukman']
$request->except(['email']); // ['name' => 'Lukman']

$request->header('Content-Type');   // 'application/json'
$request->header('content-type');   // 'application/json'
$request->headers()->has('accept'); // false

Capture from PHP globals:

$request = Request::capture();

Uploaded files:

$file = $request->file('avatar'); // UploadedFile|null

$file?->isValid();
$file?->extension();
$file?->moveTo('/var/uploads/avatar.jpg');

Response

use Lukman\Http\Response;

$response = new Response('Hello, world!', 200, ['X-App' => 'lukman-http']);

$response->content(); // 'Hello, world!'
$response->status();  // 200

$response
    ->withStatus(201)
    ->setContent('Created')
    ->header('Location', '/api/users/1');

$response->send();

JsonResponse

use Lukman\Http\JsonResponse;
use Lukman\Http\Response;

$response = new JsonResponse(['id' => 1, 'name' => 'Lukman'], 201);

$response->content();                      // '{"id":1,"name":"Lukman"}'
$response->headers()->get('content-type'); // 'application/json'

$response = Response::json(['error' => 'not found'], 404);

RedirectResponse

use Lukman\Http\RedirectResponse;
use Lukman\Http\Response;

$response = new RedirectResponse('/dashboard');

$response->headers()->get('location'); // '/dashboard'
$response->status();                   // 302

$response = new RedirectResponse('/new-url', 301);
$response = Response::redirect('/login', 302);

MiddlewarePipeline

use Lukman\Http\MiddlewareInterface;
use Lukman\Http\MiddlewarePipeline;
use Lukman\Http\Request;
use Lukman\Http\RequestHandlerInterface;
use Lukman\Http\Response;

class AuthMiddleware implements MiddlewareInterface
{
    public function process(Request $request, RequestHandlerInterface $handler): Response
    {
        if ($request->header('Authorization') !== 'Bearer secret') {
            return new Response('Unauthorized', 401);
        }

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

class FinalHandler implements RequestHandlerInterface
{
    public function handle(Request $request): Response
    {
        return new Response('OK', 200);
    }
}

$pipeline = new MiddlewarePipeline([new AuthMiddleware()], new FinalHandler());
$response = $pipeline->handle(Request::capture());

Project Structure

src/
  HeaderBag.php
  JsonResponse.php
  MiddlewareInterface.php
  MiddlewarePipeline.php
  RedirectResponse.php
  Request.php
  RequestHandlerInterface.php
  Response.php
  UploadedFile.php
tests/
  AutoloadTest.php
  HeaderBagTest.php
  JsonResponseTest.php
  MiddlewarePipelineTest.php
  RedirectResponseTest.php
  RequestTest.php
  ResponseTest.php
  UploadedFileTest.php

Running Tests

composer test

Or directly:

vendor/bin/phpunit

License

MIT. See LICENSE.