tyto-php / router
Roteador minimalista de alta performance em PHP puro com suporte a atributos, middlewares e cache
v0.1.0
2026-11-06 01:11 UTC
Requires
- php: >=8.5
Requires (Dev)
- pestphp/pest: 5.x-dev
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
# Router PHP
Um componente de roteamento moderno, ultraleve e de alta performance desenvolvido em PHP puro 8.5. Ele utiliza **Attributes** nativos para mapeamento de endpoints, suporte a Middlewares, grupos de rotas e compilação de cache para consumo mínimo de memória em ambientes de produção.
# Sumário
- [x] [Sobre o Projeto](#sobre-o-projeto)
- [x] [Pré-requisitos](#pré-requisitos)
- [x] [Instalação](#instalação)
- [x] [Uso](#uso)
- [x] [Documentação](#documentação)
- [x] [Roadmap](#roadmap)
- [x] [Contribuindo](#contribuindo)
- [x] [Licença](#licença)
- [x] [Contato](#contato)
# Sobre o Projeto
> O **Router PHP** foi desenvolvido para resolver a necessidade de um sistema de roteamento desacoplado, sem as dependências pesadas dos frameworks tradicionais. Através de Reflection e PHP Attributes, ele oferece uma sintaxe limpa, declarativa e altamente legível para declarar rotas diretamente nos seus Controllers.
# Pré-requisitos
> Lista de requisitos necessários para rodar a biblioteca e como prepará-los:
- **PHP**: Versão 8.5 ou superior.
- **Composer**: Para gerenciamento do autoloading e testes via Pest.
```bash
composer --version
```
# Instalação
> Para instalar a dependência no seu projeto via Composer:
```bash
composer require tyto-php/router
```
Para rodar os testes da biblioteca localmente:
```bash
./vendor/bin/pest
```
# Uso
> Exemplo de como registrar rotas usando os atributos do PHP e coletá-las através do `RouteCollector`:
### 1. Declarando as Rotas no Controller
```php
namespace App\Controllers;
use Tyto\Router\Routing\Attributes\Get;
use Tyto\Router\Routing\Attributes\Post;
final readonly class BookController
{
#[Get('/books')]
public function index(): string
{
return "Lista de livros";
}
#[Get('/books/{id}')]
public function show(int $id): string
{
return "Exibindo livro {$id}";
}
}
```
### 2. Compilando e Despachando as Rotas
```php
use App\Controllers\BookController;
use Tyto\Router\Routing\RouteCollector;
use Tyto\Router\Routing\Router;
// 1. Coleta e compila os metadados dos controllers via Attributes
$collector = new RouteCollector();
$collector->addController(BookController::class);
$routes = $collector->compile();
// 2. Instancia o Router com a coleção compilada
$router = new Router($routes);
// 3. Captura a URI e o Método HTTP para despachar
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$method = $_SERVER['REQUEST_METHOD'];
$response = $router->dispatch($method, $uri);
echo $response;
```
# Documentação
### Suporte a Cache em Produção (`RouteCache`)
Para evitar o uso repetitivo do Reflection em ambientes de produção, compile e armazene as rotas em cache:
```php
use Tyto\Router\Routing\RouteCache;
use Tyto\Router\Routing\RouteCollector;
use Tyto\Router\Routing\Router;
$cacheFile = __DIR__ . '/storage/cache/routes.php';
$routes = RouteCache::load($cacheFile);
if ($routes === null) {
$collector = new RouteCollector();
$collector->addController(BookController::class);
$routes = $collector->compile();
RouteCache::store($cacheFile, $routes);
}
$router = new Router($routes);
$response = $router->dispatch($_SERVER['REQUEST_METHOD'], parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
```
# Roadmap
- [x] Versão 0.0.1: Suporte a Atributos `#[Get]` / `#[Post]`, Middlewares e Route Caching.
- [x] Versão 0.0.2: Suporte a Injeção de Dependências nativa nos Handlers de Controllers.
- [ ] Versão 0.1.0: Validação automatizada de DTO/Request via atributos.
# Contribuindo
Se você tiver uma sugestão para melhorar o projeto, faça um fork do repositório e crie uma pull request. Você também pode simplesmente abrir uma **issue** com a tag "**melhoria**". Não se esqueça de dar uma estrela ao projeto! Quaisquer contribuições que você fizer são **muito apreciadas.**
1. Fork do projeto
2. Crie sua branch de recurso (`git checkout -b feature/AmazingFeature`)
3. Confirme suas alterações (`git commit -m 'Add some AmazingFeature'`)
4. Empurre para a Filial (`git push origin feature/AmazingFeature`)
5. Abra uma **pull request**
# Contato
Viktor Leite - [@ViktorLeite](https://github.com/viktorleite) - contato@viktorleite.com
Website - [viktorleite.com.br](https://viktorleite.com.br)
# Licença
Distribuído sob a licença MIT. Veja `LICENSE` para mais informações.