PHPackages                             corviz/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. corviz/router

ActiveLibrary

corviz/router
=============

Routing system based on regular expressions for PHP 8.1+ with native Middleware support

v1.0(3y ago)53421MITPHPPHP &gt;=8.1

Since Jan 24Pushed 3y ago1 watchersCompare

[ Source](https://github.com/Corviz/router)[ Packagist](https://packagist.org/packages/corviz/router)[ RSS](/packages/corviz-router/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)DependenciesVersions (2)Used By (0)

Router
======

[](#router)

Routing system based on regular expressions for PHP 8.1+ with native Middleware support

---

How to install
--------------

[](#how-to-install)

```
composer install corviz/router

```

---

Router facade (singleton)
-------------------------

[](#router-facade-singleton)

This is the most common use scenario. That is why we provide a ready-to-use facade.

First, you have to declare you application routes:

```
use Corviz\Router\Facade\RouterFacade as Router;

/*
 * Application routes
 */
Router::get('/', function() {
    return 'Hello world!';
});

Route::get('/user/(\d+)', function(int $id){
    return "Show information for user $id";
});
```

Then, execute and output the results.

```
echo Router::dispatch();
!Router::found() && http_response_code(404);
```

**Note:** *Router::dispatch()* returns the value that was returned by controllers (a string in this example).

### Controller classes

[](#controller-classes)

If you use classes as controllers, use an array as the second parameter in the route declaration.

Example controller class

```
namespace MyApplication;

class UserController
{
    public function show(int $id)
    {
        //Search for user information in the database
        //...

        return $user;
    }
}
```

Route for the controller above.

```
Router::get('/user/(\d+)', [\MyApplication\User::class, 'show']);
```

Supported methods
-----------------

[](#supported-methods)

The supported methods for route declarations are: `get`,`post`,`put`,`patch`,`delete`,`options`,`head` or `any`

Each represents one HTTP method, except for `any`, which will attend to all of them

```
use Corviz\Router\Facade\RouterFacade as Router;

Router::get('/user/(\d+)', function(int $id) { /*...*/ });
Router::post('/user/new', function() { /*...*/ });
Router::delete('/user/(\d+)', function(int $id) { /*...*/ });
```

Middlewares
-----------

[](#middlewares)

Middlewares are responsible for request pre and post processing. We will accept callables or classes that extends `Corviz\Router\Middleware` as middlewares for your application

```
use Corviz\Router\Middleware;

class AcceptJsonMiddleware extends Middleware
{
    public function handle(Closure $next): mixed
    {
        //Interrupts in case wrong content-type was sent
        if (!$_SERVER['CONTENT_TYPE'] != 'application/json') {
            return 'Invalid content type';
        }

        return $next(); //Proceed with the request
    }
}
```

To assign a Middleware do as follows:

```
use Corviz\Router\Facade\RouterFacade as Router;

Router::any( /*...*/ )
    ->middleware(AcceptJsonMiddleware::class);
```

Or if you want to assign multiple middlewares at once:

```
use Corviz\Router\Facade\RouterFacade as Router;

Router::any( /*...*/ )
    ->middleware([Middleware1::class, Middleware2::class]);
```

Grouping
--------

[](#grouping)

To group multiple routes, you must first use the `prefix` method, then just use `group` with a callable carrying those sub-routes. For example:

```
use Corviz\Router\Facade\RouterFacade as Router;

Router::prefix('user')->group(function() {
    Router::get('list', function() { /**/ });
    Router::get('(\d+)', function(int $id) { /**/ });
    Router::post('new', function() { /**/ });
    Router::patch('(\d+)/update', function(int $id) { /**/ });
    Router::delete('(\d+)/delete', function(int $id) { /**/ });
});
```

This will create the following routes:

- user/list
- user/(\\d+)
- user/new
- user/(\\d+)/update
- user/(\\d+)/delete

### Middleware for groups

[](#middleware-for-groups)

You can assign middlewares for multiple routes at once by using the `middleware` method between `prefix` and `group`

```
use Corviz\Router\Facade\RouterFacade as Router;

Router::prefix('api')
    ->middleware(CheckTokenMiddleware::class)
    ->middleware(AcceptJsonMiddleware::class)
    ->group(function() { /* ... */ });
```

Determine the current path and method manually
----------------------------------------------

[](#determine-the-current-path-and-method-manually)

The 'dispatch()' method reads 'REQUEST\_METHOD' and 'REQUEST\_URI' indexes from *$\_SERVER* superglobal to determine which route will be executed.

However, you may want to inform it manually. If so, just feed it as follows:

```
$method = 'GET'; //or POST, PUT, PATCH, DELETE...
$path = 'users/1/show';

$output = Router::dispatch($method, $path);
```

Multiple routers
----------------

[](#multiple-routers)

If you have to work with multiple routers for whatever reason, all you have to do is the class Dispatcher, instead of the router facade

```
use Corviz\Router\Dispatcher;

$router = new Dispatcher();
$router2 = new Dispatcher();
$router3 = new Dispatcher();
//so on...
```

Then, register and execute the routes as usual:

```
$router1->get('route1', /* ... */);
$router1->prefix('group1')->group(function() use (&$router1){
    $router1->get('route2', /* ... */);
    $router1->get('route3', /* ... */);
});

echo $router1->dispatch();
!$router1->found() && http_response_code(404);
```

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity54

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

Unknown

Total

1

Last Release

1202d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/9d3937a3cc7a2cd496ff9c3cd47a86b1ca35ac9a49d1c5ebcd4844fba9da7b5b?d=identicon)[carloscarucce](/maintainers/carloscarucce)

---

Top Contributors

[![carloscarucce](https://avatars.githubusercontent.com/u/5069326?v=4)](https://github.com/carloscarucce "carloscarucce (16 commits)")

---

Tags

middlewarephp-libraryphp8routerroutingmiddlewareroutingcontrollerphp8

### Embed Badge

![Health badge](/badges/corviz-router/health.svg)

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

###  Alternatives

[htmlburger/wpemerge

A micro framework which modernizes WordPress as a CMS development by providing tools to implement MVC and more.

456137.8k8](/packages/htmlburger-wpemerge)[middlewares/request-handler

Middleware to execute request handlers

451.6M26](/packages/middlewares-request-handler)[luthier/luthier

Improved routing, middleware support, authentication tools and more for CodeIgniter 3 framework

150108.8k](/packages/luthier-luthier)[shahghasiadil/laravel-api-versioning

Elegant attribute-based API versioning solution for Laravel applications with built-in deprecation management and version inheritance

2913.6k](/packages/shahghasiadil-laravel-api-versioning)[elementaryframework/water-pipe

URL routing framework and requests/responses handler for PHP

254.6k4](/packages/elementaryframework-water-pipe)

PHPackages © 2026

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