celiovmjr / simplerouter
A lightweight, enterprise-grade PHP router with validation, middleware, and DDD principles
Installs: 133
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/celiovmjr/simplerouter
Requires
- php: >=8.2
- ext-json: *
- ext-mbstring: *
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
- symfony/var-dumper: ^7.4
README
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
- ๐ฏ 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
composer require celiovmjr/simplerouter
Or download the latest release and include via autoloader:
require_once 'vendor/autoload.php';
๐ Quick Start
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
$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
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
- Getting Started - Installation and first steps
- Architecture - DDD structure and design principles
- Routing Guide - Complete routing documentation
- Validation Guide - Validation rules and usage
- Middleware Guide - Built-in and custom middleware
- Testing Guide - Running and writing tests
- Examples - Code examples and demos
๐ฃ๏ธ 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
โ 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,uuidinteger,numeric,boolean,alpha,alphanumericmin,max,in,regex,date
โ Full Validation Documentation
๐ก๏ธ 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
class AuthMiddleware implements Middleware { public function handle(Request $request, Closure $next): Response { // Authentication logic return $next($request); } }
โ Full Middleware Documentation
๐ฅ๐ค Request & Response
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
// JSON Response::json(['data' => 'value'], 200); // HTML Response::html('<h1>Hello</h1>'); // Redirect Response::redirect('/dashboard'); // Fluent Interface Response::make('OK') ->withStatus(201) ->withHeader('X-Custom', 'Value');
โ Full Request/Response Documentation
๐งช 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
๐๏ธ 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
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
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
$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
$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); });
๐ค Contributing
Contributions welcome! Please read CONTRIBUTING.md for guidelines.
๐ License
MIT License - see LICENSE file.
๐ Acknowledgments
- Built with โค๏ธ by Celio Junior
- Inspired by Laravel and Symfony
- Architecture based on DDD principles
๐ Support
- ๐ง Email: profissional.celiojunior@outlook.com
- ๐ Issues: GitHub Issues
- ๐ Docs: Documentation
Made with โค๏ธ and PHP 8.2+