Skip to content

Releases: kevind3v/brway

BrWay CC v1.1.0

Choose a tag to compare

@kevind3v kevind3v released this 28 Oct 15:40

Grupos com função

group() aceita uma função com as rotas do grupo. Dentro dela, $this é o router. No fim, o grupo volta ao que era, sem precisar de group(null).

$router->group("admin", function () {
    $this->get("/", "Admin:home");               // /admin
    $this->get("/user/{id}", "Admin:user");      // /admin/user/{id}

    $this->group("report", function () {
        $this->get("/{year}", "Report:year");    // /admin/report/{year}
    }, Admin::class);
}, Auth::class);

$router->get("/contato", "Web:contact");         // fora do grupo
  • Middlewares do grupo vão no 3º parâmetro.
  • Grupo dentro de grupo soma o caminho e os middlewares: primeiro os do grupo de fora, depois os do de dentro e por último os da rota.
  • O namespace alterado dentro da função vale só ali dentro.
  • Também funciona com o router no parâmetro: function (Router $router) { ... }.
  • Um grupo com função fecha o grupo aberto sem função antes dele.

O formato antigo ($router->group("admin", Auth::class) seguido das rotas) continua funcionando como antes.

BrWay CC v1.0.0

Choose a tag to compare

@kevind3v kevind3v released this 28 Oct 15:11

Primeira versão da BrWay, um roteador para PHP 8.2+ simples e sem dependências: verbos RESTful, grupos, rotas nomeadas, middlewares e form spoofing, para aplicações MVC e APIs.

É a continuação do CoffeeCode Router, de Robson V. Leite, atualizado para o PHP 8.x, com correções de bugs, reforço de segurança e novos recursos.

Instalação

composer require brbunny/brway

Exemplo

use BrWay\Router;

$router = new Router("https://www.seudominio.com");
$router->namespace("App\Controllers");

$router->get("/", "Web:home");
$router->get("/user/{id}", "User:show", "user.show");
$router->put("/user/{id}", [User::class, "update"]);

$router->group("admin", Auth::class);
$router->get("/", "Admin:home");

$router->dispatch();

if ($router->error()) {
    $router->redirect("/error/{$router->error()}");
}

Segurança

  • O middleware do grupo roda junto com o da rota. Antes, uma rota com middleware próprio perdia o do grupo (ex.: o Auth de um grupo admin).
  • ?route=, /index.php?route= e /index.php/x não trocam mais a rota aberta, então bloqueios feitos no servidor não podem ser contornados.
  • Um campo do corpo da requisição não sobrescreve um parâmetro da URL ({id}).
  • Parâmetros da rota recusam caracteres de controle (%00, %0A).
  • route() codifica os valores nas URLs geradas.
  • Um handler em string nunca é executado como função ("phpinfo:x").
  • O corpo de PUT/PATCH/DELETE é limitado ao post_max_size.

Correções

  • Funciona com a config padrão do Nginx (try_files $uri /index.php?$query_string), o problema da issue robsonvleite#61.
  • Espaço, &, # e + no endereço chegam corretos à rota.
  • Os parâmetros da rota saem certos dentro de grupos.
  • A rota mais específica vence (/user/new antes de /user/{id}), em qualquer ordem de registro.
  • O caminho da rota é comparado literalmente (. é um ponto).
  • Códigos de erro corretos: 404 (sem rota), 405 (caminho existe em outro verbo), 501 (controller, método ou middleware inexistente).
  • Sem deprecations no PHP 8.4 e 8.5.

Novos recursos

  • HEAD usa as rotas GET.
  • Corpo em JSON (application/json) no POST, PUT, PATCH e DELETE.
  • Handler no formato [Controller::class, "metodo"].

Migrando do CoffeeCode Router

Troque use CoffeeCode\Router\Router; por use BrWay\Router;. Algumas mudanças de comportamento exigem atenção: veja Migrando do CoffeeCode Router no README.