flaviosenos/routerx 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

flaviosenos/routerx

Composer 安装命令:

composer require flaviosenos/routerx

包简介

Uma biblioteca de roteamento PHP amigável e flexível.

README 文档

README

RouterX é uma biblioteca de roteamento PHP leve e fácil de usar, projetada para gerenciar as rotas da sua aplicação de forma amigável, com suporte a middlewares, integração com templates e capacidade de atender a APIs RESTful. Ela oferece um controle granular sobre como suas URLs são mapeadas para a lógica da sua aplicação.

Por Que RouterX?

Em um mundo de frameworks complexos, RouterX se destaca pela sua simplicidade e foco. Ela oferece os recursos essenciais para um roteamento eficiente sem a sobrecarga de um framework completo, permitindo que você construa sua aplicação com a arquitetura que desejar.

Funcionalidades Atuais

  • Rotas Amigáveis: Defina URLs limpas e descritivas (ex: /produtos/detalhes/{id}).

  • Suporte a Middlewares: Intercepte requisições e respostas para adicionar lógica pré- e pós-controlador (autenticação, logging, CORS, etc.).

  • Integração com Template Engines: Permite que você passe qualquer motor de templates para seus controladores e renderize facilmente suas views.

  • Pronta para APIs: Retorne respostas JSON de forma simples, ideal para construir APIs RESTful.

  • Parâmetros de URI: Capture slugs e IDs diretamente da URL.

  • Query Parameters: Acesse facilmente parâmetros de consulta, incluindo identificadores de campanha (UTM).

  • Grupos de Rotas: Organize suas rotas com prefixos de URI e middlewares compartilhados.

Instalação

RouterX é uma biblioteca de roteamento PHP leve e fácil de usar, projetada para gerenciar as rotas da sua aplicação de forma amigável, com suporte a middlewares, integração com templates e capacidade de atender a APIs RESTful. Ela oferece um controle granular sobre como suas URLs são mapeadas para a lógica da sua aplicação.

composer require flaviosenos/routerx

Como Usar

1. Inicialização e Configuração Básica

Crie sua instância do Router e, opcionalmente, configure seu motor de templates (passando-o para o Router e depois para os seus controladores).

<?php

require_once __DIR__ . '/vendor/autoload.php'; // Inclui o autoloader do Composer

use RouterX\Router;
use RouterX\Request;
use RouterX\Response;

// Exemplo de configuração de um motor de templates (pode ser Twig, Blade, Smarty, etc.)
// Isso é apenas um exemplo de como você passaria um engine, não é obrigatório para o RouterX funcionar.
// class MyCustomTemplateEngine { public function render(string $template, array #data = []): string { /* ... */ } }
// $myTemplateEngine = new MyCustomTemplateEngine();

// Instancia o Router
$router = new Router();
// Opcional: Se você usa um motor de templates, pode passá-lo para o Router
// $router->setTemplateEngine($myTemplateEngine);

2. Definindo Rotas

Você pode definir rotas para diferentes métodos HTTP e com parâmetros na URI.

// Rota GET simples
$router->get('/', function (Request $request, Response $response) {
    return $response->setContent("Bem-vindo à Home da RouterX!");
});

// Rota com parâmetro de URI (ID ou Slug)
$router->get('/blog/{slug}', [App\Controllers\BlogController::class, 'showPost']);

// Rota para API (POST)
$router->post('/api/pedidos', [App\Controllers\OrderController::class, 'createOrder']);

3. Usando Grupos de Rotas

Agrupe rotas com prefixos e middlewares compartilhados.

$router->group('/admin', function (Router $router) {
    // Rotas dentro de /admin, por exemplo: /admin/dashboard
    $router->get('/dashboard', [App\Controllers\AdminController::class, 'dashboard']);

    // Todas as rotas neste grupo podem usar o AuthMiddleware
    $router->get('/users', [App\Controllers\AdminController::class, 'listUsers'])
           ->addMiddleware(App\Middlewares\AuthMiddleware::class);
});

4. Middlewares

Crie middlewares implementando a RouterX\Middleware\MiddlewareInterface.

<?php

namespace App\Middlewares;

use RouterX\Middleware\MiddlewareInterface;
use RouterX\Request;
use RouterX\Response;
use Closure;

class AuthMiddleware implements MiddlewareInterface
{
    public function process(Request $request, Response $response, Closure $next): Response
    {
        // Exemplo: Verificar um token de autenticação
        $token = $request->getHeader('Authorization');
        if (empty($token) || $token !== 'Bearer meu_token_secreto') {
            return $response->json(['error' => 'Não autorizado'], 401);
        }

        // Chama o próximo middleware ou o controlador
        return $next($request, $response);
    }
}

Aplique middlewares às rotas:

$router->post('/api/produtos', [App\Controllers\ProductController::class, 'store'])
       ->addMiddleware(App\Middlewares\AuthMiddleware::class)
       ->addMiddleware(App\Middlewares\LogMiddleware::class);
  1. Controladores e Interagindo com Request/Response Seus controladores recebem objetos Request e Response. Se você passou um motor de templates para o Router, ele será injetado no construtor do seu controlador.
<?php

namespace App\Controllers;

use RouterX\Request;
use RouterX\Response;

// Note que não há dependência específica de um template engine aqui,
// apenas um tipo genérico 'object' ou 'mixed'.
class ProductController
{
    private ?object $templateEngine;

    public function __construct(?object $templateEngine = null)
    {
        $this->templateEngine = $templateEngine;
    }

    public function show(Request $request, Response $response): Response
    {
        // Obtém um parâmetro da URI (ex: /produtos/{id})
        $productId = $request->getUriParameter('id');

        // Obtém um parâmetro de query string (ex: /produtos?sort=price)
        $sortBy = $request->getQueryParam('sort', 'name');

        // Renderiza conteúdo usando o template engine (se disponível)
        if (isset($this->templateEngine)) { // Use isset para verificar se o templateEngine foi injetado
            // Exemplo de uso (adapte para o seu motor de templates)
            // return $response->setContent($this->templateEngine->render('product_detail.html', ['id' => $productId, 'sortBy' => $sortBy]));
            return $response->setContent("Renderizando produto $productId com ordenação por $sortBy usando um template engine.");
        }

        // Retorna JSON para API
        return $response->json(['id' => $productId, 'sortBy' => $sortBy, 'message' => 'Detalhes do produto']);
    }

    public function listFilteredProducts(Request $request, Response $response): Response
    {
        // Capturando múltiplos slugs para filtros (ex: /produtos/eletrodomesticos/eletrolux)
        $categorySlug = $request->getUriParameter('categorySlug');
        $brandSlug = $request->getUriParameter('brandSlug'); // Pode ser null se não informado

        // ... lógica de filtragem de produtos ...

        return $response->json([
            'category' => $categorySlug,
            'brand' => $brandSlug,
            'products' => [] // array de produtos filtrados
        ]);
    }
}
  1. Despachando a Requisição No seu ponto de entrada (public/index.php), chame dispatch().
// ... (rotas definidas) ...

// Define um handler para 404 (rota não encontrada)
$router->setNotFoundHandler(function (Request $request, Response $response) {
    $response->setStatusCode(404)->setContent("<h1>Página Não Encontrada</h1>")->send();
});

// Inicia o roteamento
$router->dispatch();

Melhorias Futuras (Roadmap) RouterX está em constante evolução! Consideramos as seguintes melhorias para o futuro:

Nomear Rotas e Geração de URLs: Permitir que as rotas sejam nomeadas para gerar URLs de forma programática (ex: Router::url('product.show', ['id' => 123])), garantindo que os links permaneçam consistentes mesmo se a estrutura da URI mudar.

Asserções de Parâmetros de Rota: Adicionar suporte para validação de tipos de parâmetros na URI (ex: /users/{id:\d+} para garantir que id seja um número).

Cache de Rotas: Implementar um mecanismo de cache para compilar as rotas em produção, otimizando o desempenho e evitando o reprocessamento a cada requisição.

Integração com PSR-7/PSR-15: Adotar os padrões PSR-7 (HTTP Messages) e PSR-15 (HTTP Handlers) para as classes Request e Response, promovendo maior interoperabilidade com outras bibliotecas e middlewares do ecossistema PHP.

Tratamento de Exceções Avançado: Oferecer um sistema mais robusto para capturar e tratar diferentes tipos de exceções (ex: 405 Method Not Allowed, 403 Forbidden) com handlers específicos.

Suporte a Invokable Controllers: Permitir que classes com o método __invoke() sejam usadas como handlers de rota.

Testes Automatizados: Expandir a cobertura de testes para garantir a estabilidade e confiabilidade da biblioteca em todas as suas funcionalidades.

Contribuição

Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests em nosso repositório no GitHub.

Licença

Este projeto está licenciado sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.

统计信息

  • 总下载量: 2
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-07-15