Search by

Roteamento MVC PHP 8.5 com atributos #[Route], Rate Limiting, CORS automático, Error Handlers e validação tipada de parâmetros

Package info

github.com/jonatasfenske/router

pkg:composer/jonatasfenske/router

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-11-13 19:01 UTC

This package is auto-updated.

Last update: 2026-11-13 19:24:11 UTC


README

Roteamento MVC PHP 8.5 com atributos #[Route], Rate Limiting e CORS

PHP 8.5+ MIT License

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 _method em 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