PHPackages                             celiovmjr/simplerouter - 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. celiovmjr/simplerouter

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

celiovmjr/simplerouter
======================

A lightweight, enterprise-grade PHP router with validation, middleware, and DDD principles

3.0.0(3mo ago)0133MITPHPPHP &gt;=8.2

Since Jun 21Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/celiovmjr/SimpleRouter)[ Packagist](https://packagist.org/packages/celiovmjr/simplerouter)[ RSS](/packages/celiovmjr-simplerouter/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (3)Versions (12)Used By (0)

🚀 SimpleRouter
==============

[](#-simplerouter)

[![PHP Version](https://camo.githubusercontent.com/d840cef9807c8f76051ad687841d67f4d830c84e0d83236968e53124ef6742d5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344382e322d3838393242462e737667)](https://php.net/)[![License](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](LICENSE)![Tests](https://camo.githubusercontent.com/27ef4a6c4d8899f97f206dc967c402c4cbf806c2f8a9bfbd2862b39efee90186/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d31303025324225323070617373696e672d627269676874677265656e2e737667)![Code Coverage](https://camo.githubusercontent.com/06e33fb4024f7f9c576cc80d22e78dbb33bd31fd8dbf978c6effb2adbf0f5087/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d39352532352d627269676874677265656e2e737667)

A lightweight, enterprise-grade PHP router with **Domain-Driven Design (DDD)** architecture, featuring powerful validation, middleware pipeline, and zero dependencies.

```
// It's this simple
$router = new Router();

$router->post('/users', function(Request $request) {
    $validated = $request->validated([
        'name' => 'required|min:3|max:50',
        'email' => 'required|email',
        'age' => 'required|integer|min:18'
    ]);

    return Response::json($validated, 201);
});

$router->run();
```

✨ Features
----------

[](#-features)

- 🎯 **Clean Architecture** - Domain-Driven Design (DDD) with clear separation of concerns
- ⚡ **Zero Dependencies** - Pure PHP 8.2+, no external packages required
- 🛡️ **Type Safety** - Full type hints with strict types enabled
- 🔒 **Built-in Validation** - 17+ validation rules with custom messages
- 🔄 **Middleware Pipeline** - Powerful middleware system with built-in CORS, Rate Limiting, and Logging
- 🎨 **Flexible Routing** - RESTful routes, route groups, named routes, and multiple HTTP methods
- 📝 **Smart Parameters** - Type-safe route parameters (int, uuid, slug, alpha, etc.)
- 🧪 **100+ Tests** - Comprehensive test suite with PHPUnit
- 📖 **Rich Documentation** - Complete examples and API reference

📦 Installation
--------------

[](#-installation)

```
composer require celiovmjr/simplerouter
```

Or download the latest release and include via autoloader:

```
require_once 'vendor/autoload.php';
```

🚀 Quick Start
-------------

[](#-quick-start)

### Basic Route

[](#basic-route)

```
use SimpleRouter\Application\Router;
use SimpleRouter\Application\Http\{Request, Response};

$router = new Router();

$router->get('/hello/{name}', function(Request $request) {
    $name = $request->input('name');
    return Response::json(['message' => "Hello, {$name}!"]);
});

$router->run();
```

### With Validation

[](#with-validation)

```
$router->post('/register', function(Request $request) {
    $validated = $request->validated([
        'name' => 'required|alpha|min:3|max:50',
        'email' => 'required|email|onError("Please provide a valid email")',
        'password' => 'required|min:8',
        'age' => 'required|integer|min:18|onError("You must be 18 or older")'
    ]);

    // Create user...

    return Response::json([
        'message' => 'User registered successfully',
        'user' => $validated
    ], 201);
});
```

### With Middleware

[](#with-middleware)

```
use SimpleRouter\Application\Middleware\Builtin\{
    CorsMiddleware,
    RateLimitMiddleware,
    LoggingMiddleware
};

$router->group([
    'prefix' => '/api',
    'middleware' => [
        CorsMiddleware::production(['https://app.example.com']),
        RateLimitMiddleware::api(),
        LoggingMiddleware::production(__DIR__ . '/logs/api.log')
    ]
], function($router) {
    $router->get('/users', [UserController::class, 'index']);
    $router->post('/users', [UserController::class, 'store']);
});
```

📚 Documentation
---------------

[](#-documentation)

- **[Getting Started](docs/GETTING-STARTED.md)** - Installation and first steps
- **[Architecture](docs/ARCHITECTURE.md)** - DDD structure and design principles
- **[Routing Guide](docs/ROUTING.md)** - Complete routing documentation
- **[Validation Guide](docs/VALIDATION.md)** - Validation rules and usage
- **[Middleware Guide](docs/MIDDLEWARE.md)** - Built-in and custom middleware
- **[Testing Guide](docs/TESTING.md)** - Running and writing tests
- **[Examples](examples/)** - Code examples and demos

🛣️ Routing
----------

[](#️-routing)

```
// HTTP Methods
$router->get('/users', $handler);
$router->post('/users', $handler);
$router->put('/users/{id}', $handler);
$router->delete('/users/{id}', $handler);

// Typed Parameters
$router->get('/users/{id:int}', $handler);
$router->get('/posts/{uuid:uuid}', $handler);
$router->get('/blog/{slug:slug}', $handler);

// Route Groups
$router->group(['prefix' => '/api/v1'], function($router) {
    $router->get('/users', $handler);
});

// Named Routes
$router->get('/dashboard', $handler)->withName('dashboard');
$url = $router->route('dashboard');
```

[→ Full Routing Documentation](docs/ROUTING.md)

✅ Validation
------------

[](#-validation)

```
$validated = $request->validated([
    'email' => 'required|email',
    'age' => 'required|integer|min:18|max:120',
    'username' => 'required|alphanumeric|min:3|max:20',
    'role' => 'required|in:admin,user,guest'
]);
```

**17+ Built-in Rules:**

- `required`, `email`, `url`, `uuid`
- `integer`, `numeric`, `boolean`, `alpha`, `alphanumeric`
- `min`, `max`, `in`, `regex`, `date`

[→ Full Validation Documentation](docs/VALIDATION.md)

🛡️ Middleware
-------------

[](#️-middleware)

### Built-in Middleware

[](#built-in-middleware)

```
// CORS
CorsMiddleware::production(['https://app.example.com']);

// Rate Limiting
RateLimitMiddleware::api();        // 100 req/min
RateLimitMiddleware::auth();       // 5 req/min
RateLimitMiddleware::perUser(1000, 60);

// Logging
LoggingMiddleware::production('/var/log/api.log');
LoggingMiddleware::debug('/var/log/debug.log');
```

### Custom Middleware

[](#custom-middleware)

```
class AuthMiddleware implements Middleware
{
    public function handle(Request $request, Closure $next): Response
    {
        // Authentication logic
        return $next($request);
    }
}
```

[→ Full Middleware Documentation](docs/MIDDLEWARE.md)

📥📤 Request &amp; Response
-------------------------

[](#-request--response)

### Request

[](#request)

```
// Input
$request->input('name');
$request->all();
$request->only(['name', 'email']);
$request->validated($rules);

// Headers & Query
$request->header('Authorization');
$request->query('page', 1);

// Request Info
$request->method();
$request->ip();
$request->path();
```

### Response

[](#response)

```
// JSON
Response::json(['data' => 'value'], 200);

// HTML
Response::html('Hello');

// Redirect
Response::redirect('/dashboard');

// Fluent Interface
Response::make('OK')
    ->withStatus(201)
    ->withHeader('X-Custom', 'Value');
```

[→ Full Request/Response Documentation](docs/REQUEST-RESPONSE.md)

🧪 Testing
---------

[](#-testing)

```
# Run all tests
./run-tests.sh

# Run specific suite
./run-tests.sh router
./run-tests.sh validation

# Generate coverage
./run-tests.sh coverage
```

**100+ Tests** covering:

- Router functionality
- Validation rules
- Request/Response handling
- Middleware pipeline

[→ Full Testing Documentation](docs/TESTING.md)

🏗️ Architecture
---------------

[](#️-architecture)

SimpleRouter follows **Domain-Driven Design (DDD)**:

```
src/
├── Domain/              # Business logic
│   ├── Contracts/       # Interfaces (Middleware, ValidationRule, Validator)
│   ├── Entities/        # Domain entities (Route, RouteCollection)
│   └── ValueObjects/    # Value objects (HttpMethod, Uri)
└── Application/         # Application logic
    ├── Router.php       # Main router
    ├── Http/            # Request/Response
    ├── Validation/      # Validation system
    │   ├── RequestValidator.php
    │   ├── RuleParser.php
    │   ├── ValidationResult.php
    │   └── Rules/       # Individual rule files (17 rules)
    ├── Middleware/      # Middleware pipeline
    │   ├── MiddlewarePipeline.php
    │   └── Builtin/     # CorsMiddleware, RateLimitMiddleware, LoggingMiddleware
    └── Exceptions/      # Custom exceptions

```

[→ Full Architecture Documentation](docs/ARCHITECTURE.md)

**Design Principles:**

- ✅ SOLID principles
- ✅ Clean Code practices
- ✅ DDD architecture (Domain/Application layers)
- ✅ Type safety (PHP 8.2+)
- ✅ Zero global state
- ✅ Interface-based design
- ✅ 17 individual validation rule files
- ✅ 3 production-ready built-in middleware

📖 Examples
----------

[](#-examples)

### API with Database

[](#api-with-database)

```
$router->get('/users', function(Request $request) {
    $page = $request->query('page', 1);
    $limit = $request->query('limit', 10);

    $users = User::paginate($page, $limit);

    return Response::json([
        'data' => $users,
        'page' => $page,
        'total' => User::count()
    ]);
});
```

### Authentication

[](#authentication)

```
$router->post('/login', function(Request $request) {
    $validated = $request->validated([
        'email' => 'required|email',
        'password' => 'required|min:8'
    ]);

    $token = Auth::attempt($validated);

    return Response::json([
        'token' => $token,
        'expires_in' => 3600
    ]);
});
```

### File Upload

[](#file-upload)

```
$router->post('/upload', function(Request $request) {
    $file = $request->file('document');

    if ($file && $file->isValid()) {
        $path = $file->store('uploads');
        return Response::json(['path' => $path], 201);
    }

    return Response::json(['error' => 'Invalid file'], 400);
});
```

[→ More Examples](examples/)

🤝 Contributing
--------------

[](#-contributing)

Contributions welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

📄 License
---------

[](#-license)

MIT License - see [LICENSE](LICENSE) file.

🙏 Acknowledgments
-----------------

[](#-acknowledgments)

- Built with ❤️ by [Celio Junior](https://fb.com/celiojr1994)
- Inspired by Laravel and Symfony
- Architecture based on DDD principles

📞 Support
---------

[](#-support)

- 📧 Email:
- 🐛 Issues: [GitHub Issues](https://github.com/celiovmjr/simplerouter/issues)
- 📖 Docs: [Documentation](docs/)

---

**Made with ❤️ and PHP 8.2+**

###  Health Score

41

—

FairBetter than 89% of packages

Maintenance78

Regular maintenance activity

Popularity10

Limited adoption so far

Community4

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

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 ~56 days

Recently: every ~139 days

Total

11

Last Release

118d ago

Major Versions

1.0.0 → 2.0.02024-06-25

2.0.8 → 3.0.02026-01-12

PHP version history (2 changes)1.0.0PHP &gt;=8.1

3.0.0PHP &gt;=8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/0277186b718fe518349a01fb7b34ad6eb0d67ef64801cb6a9eca3e4f8df77f67?d=identicon)[celiovmjr](/maintainers/celiovmjr)

---

Tags

httppsr-7middlewarevalidationrouterroutingddd

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/celiovmjr-simplerouter/health.svg)

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

###  Alternatives

[middlewares/fast-route

Middleware to use FastRoute

96191.1k15](/packages/middlewares-fast-route)[middlewares/aura-router

Middleware to use Aura.Router

1110.9k3](/packages/middlewares-aura-router)[northwoods/router

Fast router for PSR-15 request handlers

161.4k](/packages/northwoods-router)

PHPackages © 2026

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