Search by

tyto-php / router

viktorleite

Roteador minimalista de alta performance em PHP puro com suporte a atributos, middlewares e cache

v0.1.0 2026-11-06 01:11 UTC

This package is auto-updated.

Last update: 2026-11-06 01:12:58 UTC


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.