jonatasfenske / router
Roteamento MVC PHP 8.5 com atributos #[Route], Rate Limiting, CORS automático, Error Handlers e validação tipada de parâmetros
v1.0.0
2026-11-13 19:01 UTC
Requires
- php: >=8.5
Requires (Dev)
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Roteamento MVC PHP 8.5 com atributos #[Route], Rate Limiting e CORS
Instalação
composer require jonatasfenske/router
Recursos
- Atributo
#[Route]— declaração declarativa de rotas diretamente nos controllers - AttributeRouter — registro automático via reflexão com cache para produção
- Rate Limiting — middleware com headers X-RateLimit e resposta 429 JSON
- CORS automático — preflight OPTIONS, credentials, origens específicas ou wildcard
- Error Handlers — respostas padronizadas por código HTTP com presets JSON para APIs
- Validação tipada de parâmetros —
{id:int},{slug:slug},{uuid:uuid},{flag:bool} - Tipos customizáveis — via
RouteValidator::registerType() - Enums — HttpMethod e HttpStatusCode para type-safety
- Form Spoofing — suporte a
_methodem formulários HTML - Rotas nomeadas — geração de URLs e redirects
Uso Rápido
Rotas com Closures
use JonatasFenske\Router\Router; $router = new Router('https://meusite.com'); $router->get('/', fn() => echo 'Home', name: 'home'); $router->post('/contato', fn(array $data) => handleContact($data), name: 'contact.store'); $router->dispatch();
Rotas com Controllers
$router->namespace('App\Controllers'); $router->get('/users', 'UserController:index', name: 'users.index'); $router->get('/users/{id:int}', 'UserController:show', name: 'users.show');
Atributos #[Route]
use JonatasFenske\Router\RouteAttribute; class UserController { #[Route('GET', '/users/{id:int}', name: 'users.show')] public function show(int $id): void { /* ... */ } #[Route('POST', '/users', name: 'users.store', middleware: AuthMiddleware::class)] public function store(): void { /* ... */ } } // Registro automático $attrRouter = new AttributeRouter($router); $attrRouter->registerController(UserController::class);
Middlewares Integrados
use JonatasFenske\Router\Middleware\RateLimiter; use JonatasFenske\Router\Middleware\CorsMiddleware; $router->group('api', middleware: [CorsMiddleware::class, RateLimiter::class]);
Error Handlers JSON
use JonatasFenske\Router\ErrorHandler; ErrorHandler::useJsonDefaults(); // 404 → {"error": true, "code": 404, "message": "Not Found"}
Validação de Parâmetros
$router->get('/users/{id:int}', 'UserController:show'); // só números → int $router->get('/posts/{slug:slug}', 'PostController:show'); // kebab-case $router->get('/files/{uuid:uuid}', 'FileController:get'); // UUID v4
Testes
composer test
Licença
MIT