PHPackages                             fatjon-lleshi/antares-router - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. fatjon-lleshi/antares-router

ActiveLibrary[HTTP &amp; Networking](/categories/http)

fatjon-lleshi/antares-router
============================

Lightweight attribute-based router for PHP 8.2+

v0.1.4(1mo ago)0151MITPHPPHP &gt;=8.2

Since Apr 23Pushed 1mo agoCompare

[ Source](https://github.com/johnlesis/antares-router)[ Packagist](https://packagist.org/packages/fatjon-lleshi/antares-router)[ Docs](https://github.com/johnlesis/antares-router)[ RSS](/packages/fatjon-lleshi-antares-router/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (3)Versions (6)Used By (1)

antares-router
==============

[](#antares-router)

Lightweight attribute-based router for PHP 8.2+. Built on top of [nikic/fast-route](https://github.com/nikic/FastRoute). Can be used standalone or as part of the [Antares framework](https://github.com/johnlesis/antares).

Installation
------------

[](#installation)

```
composer require fatjon-lleshi/antares-router
```

Standalone Usage
----------------

[](#standalone-usage)

### Example Project Structure

[](#example-project-structure)

```
project/
├── public/
│   └── index.php
├── app/
│   └── Controllers/
│       ├── UserController.php
│       └── ProductController.php
├── routes.php
└── composer.json

```

### Defining Routes

[](#defining-routes)

Define routes directly on controller methods using PHP attributes:

```
use Antares\Router\Attributes\Get;
use Antares\Router\Attributes\Post;
use Antares\Router\Attributes\Put;
use Antares\Router\Attributes\Patch;
use Antares\Router\Attributes\Delete;

class UserController
{
    #[Get('/users')]
    public function index(): void {}

    #[Get('/users/{id}')]
    public function show(): void {}

    #[Post('/users', 201)]
    public function store(): void {}

    #[Put('/users/{id}')]
    public function update(): void {}

    #[Patch('/users/{id}')]
    public function edit(): void {}

    #[Delete('/users/{id}', 204)]
    public function destroy(): void {}
}
```

### Registering Routes

[](#registering-routes)

Create a `routes.php` file that registers all your controllers:

```
use Antares\Router\Router;

return function(Router $router): void {
    $router->register(UserController::class);
    $router->register(ProductController::class);
    $router->register(OrderController::class);
};
```

### Bootstrapping

[](#bootstrapping)

In `public/index.php`, create the router, load the routes file, and dispatch the request:

```
use Antares\Router\Router;

$router = new Router();
$register = require __DIR__ . '/../routes.php';
$register($router);

try {
    [$controllerClass, $method, $routeParams, $statusCode] = $router->match(
        $_SERVER['REQUEST_METHOD'],
        parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
    );

    $controller = new $controllerClass();
    $controller->$method();
} catch (\RuntimeException $e) {
    http_response_code($e->getCode());
    echo json_encode(['error' => $e->getMessage()]);
}
```

### Route Parameters

[](#route-parameters)

Parameters in the path are extracted and returned as an array:

```
[$controller, $method, $params, $status] = $router->match('GET', '/users/42');

echo $params['id']; // "42"
```

### Custom Status Codes

[](#custom-status-codes)

Pass a status code as the second argument to any route attribute. Defaults to `200`:

```
#[Post('/users', 201)]
public function store(): void {}

#[Delete('/users/{id}', 204)]
public function destroy(): void {}
```

### Array Config

[](#array-config)

Register routes from a plain array if you prefer config-based routing instead of attributes:

```
$router->registerFromConfig([
    ['GET',    '/users',      UserController::class, 'index',   200],
    ['POST',   '/users',      UserController::class, 'store',   201],
    ['GET',    '/users/{id}', UserController::class, 'show',    200],
    ['PUT',    '/users/{id}', UserController::class, 'update',  200],
    ['DELETE', '/users/{id}', UserController::class, 'destroy', 204],
]);
```

### YAML Config

[](#yaml-config)

Register routes from a YAML file. Requires `symfony/yaml`:

```
composer require symfony/yaml
```

```
routes:
  - method: GET
    path: /users
    controller: App\Controllers\UserController
    action: index
    status: 200
  - method: POST
    path: /users
    controller: App\Controllers\UserController
    action: store
    status: 201
```

```
$router->registerFromYaml(__DIR__ . '/../routes.yaml');
```

### Route Caching

[](#route-caching)

Cache compiled routes for production to avoid reflection overhead on every request:

```
$cachePath = __DIR__ . '/../storage/cache/routes.php';

if (file_exists($cachePath)) {
    $router->loadFromCache($cachePath);
} else {
    $register = require __DIR__ . '/../routes.php';
    $register($router);
    $router->saveToCache($cachePath);
}
```

### Error Handling

[](#error-handling)

`match()` throws a `RuntimeException` when a route is not found or the method is not allowed:

```
try {
    [$controller, $method, $params, $status] = $router->match('GET', '/not-found');
} catch (\RuntimeException $e) {
    $e->getCode(); // 404 = not found, 405 = method not allowed
}
```

Available Attributes
--------------------

[](#available-attributes)

AttributeHTTP Method`#[Get]`GET`#[Post]`POST`#[Put]`PUT`#[Patch]`PATCH`#[Delete]`DELETERequirements
------------

[](#requirements)

- PHP 8.2+
- nikic/fast-route ^1.3

License
-------

[](#license)

MIT

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance91

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

5

Last Release

46d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/df0f35469fdbbf631a4cb84841061c1ee72df72e799080fc9eea6472b3fcee82?d=identicon)[johnlesis](/maintainers/johnlesis)

---

Top Contributors

[![johnlesis](https://avatars.githubusercontent.com/u/127132076?v=4)](https://github.com/johnlesis "johnlesis (10 commits)")

---

Tags

httpphprestrouterroutingattributes

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/fatjon-lleshi-antares-router/health.svg)

```
[![Health](https://phpackages.com/badges/fatjon-lleshi-antares-router/health.svg)](https://phpackages.com/packages/fatjon-lleshi-antares-router)
```

###  Alternatives

[aphiria/aphiria

The Aphiria framework

1428.0k2](/packages/aphiria-aphiria)[wilaak/radix-router

High-performance radix tree based HTTP request router

615.0k5](/packages/wilaak-radix-router)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
