miniroute
A small attribute-based routing and middleware kernel for PHP applications.
miniroute is the tiny piece of routing machinery extracted from brett-parson.com. It provides attribute-declared routes, deterministic route matching, and an onion-style middleware pipeline — without being a framework.
Requirements
- PHP >= 8.2
Install
Via Composer (Packagist)
composer require brettparson/miniroute:^0.1
The package is published on Packagist; the canonical source is the cgit repository.
Via a local path repository (development)
{
"repositories": [
{ "type": "path", "url": "../miniroute", "options": { "symlink": true } }
],
"require": { "brettparson/miniroute": "@dev" }
}
Usage
use BrettParson\MiniRoute\Attribute\Get;
use BrettParson\MiniRoute\Attribute\Middleware;
use BrettParson\MiniRoute\Attribute\Post;
use BrettParson\MiniRoute\Http\RequestInterface;
use BrettParson\MiniRoute\Http\ResponseInterface;
use BrettParson\MiniRoute\Routing\Router;
final class NoteController
{
#[Get('/notes')]
public function index(RequestInterface $request): ResponseInterface
{
// ...
}
#[Post('/notes')]
#[Middleware(SomeMiddleware::class)]
public function store(RequestInterface $request): ResponseInterface
{
// ...
}
}
The router needs a controller/middleware resolver — an app-owned seam for building objects:
$router = new Router($resolver);
$router->group('/admin', [RequireAdmin::class, RequireCsrf::class]);
$router->registerControllers([
HomeController::class,
NoteController::class,
]);
$response = $router->dispatch($request);
$response->send();
What it does
- Route attributes —
#[Get],#[Post],#[Put],#[Patch],#[Delete]declare routes directly on controller methods. - Deterministic matching — literal segments beat
{parameter}segments, so registration order never matters. - Middleware —
#[Middleware(...)]on methods or classes, plus router-levelgroup()middleware by path prefix. - Thin HTTP contracts —
RequestInterfaceandResponseInterfacekeep the kernel decoupled from any one application's HTTP objects.
What it is not
No container, no template engine, no ORM, no auth, no session handling, no configuration loader. Those stay application concerns.
Tests
composer install
composer check # lint + unit tests
composer bench # registration/dispatch scaling benchmark
Or, without Composer, drop a phpunit.phar into the repo root and run
php phpunit.phar.
License
MIT — see LICENSE.
