stonks/router

O Router é um componente de rotas PHP com abstração para MVC. Preparado com verbos RESTful (GET, POST, PUT, PATCH e DELETE), ele trabalha em sua própria camada de forma isolada.

1.0.1 2020-10-08 19:51 UTC

This package is auto-updated.

Last update: 2024-05-09 03:34:36 UTC


README

Maintainer Source Code PHP from Packagist Latest Version Software License Build Quality Score Total Downloads

O Router é um componente de rotas PHP com abstração para MVC. Preparado com verbos RESTful (GET, POST, PUT, PATCH e DELETE), ele trabalha em sua própria camada de forma isolada.

Destaques

  • Classe Router com todos os verbos RESTful
  • Despacho otimizado com controle total de decisões
  • Falsificador (Spoofing) de requisição para verbalização local
  • É muito simples criar rotas para sua aplicação ou API
  • Gatilho e transportador de dados para o controlador
  • Pronto para o composer
  • Compatível com PSR-2

Instalação

Router está disponível via Composer:

"stonks/router": "1.0.*"

ou execute

composer require stonks/router

Documentação

Para obter mais detalhes sobre como usar o Router, consulte a pasta de amostra com detalhes no diretório do componente.

Para usar o Router, é preciso redirecionar sua navegação para o arquivo raiz de rotas (index.php) onde todo o tráfego deve ser tratado. O exemplo abaixo mostra como:

Apache

Options All -Indexes

RewriteEngine On

# ROUTER - Força o redirecionamento para WWW.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ROUTER - Força o redirecionamento para HTTPS.
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ROUTER - URL Amigável (Reescrita)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=/$1 [L,QSA]

Rotas

<?php
require __DIR__ . "/../vendor/autoload.php";

use Stonks\Router\Router;

$router = new Router("https://www.seudominio.com");

/**
 * Rotas
 * O controlador deve estar no namespace Test\Controller
 * isto produz rotas para: rota, rota/$id, rota/{$id}/perfil, etc.
 */
$router->namespace("Test");

$router->get("/rota", "Controller:method");
$router->post("/rota/{id}", "Controller:method");
$router->put("/rota/{id}/perfil", "Controller:method");
$router->patch("/rota/{id}/perfil/{foto}", "Controller:method");
$router->delete("/rota/{id}", "Controller:method");

/**
 * Agrupar por rotas e namespace
 * O controlador deve estar no namespace Dash\Controller
 * isto produz rotas para: /admin/rota e /admin/rota/$id
 */
$router->group("admin")->namespace("Dash");
$router->get("/rota", "Controller:method");
$router->post("/rota/{id}", "Controller:method");

/**
 * Grupo de erro
 * Isso monitora todos os erros do Router. São eles: 
 * 400 Pedido ruim (Bad Request)
 * 404 Não encontrado (Not Found)
 * 405 Método não permitido (Method Not Allowed)
 * 501 Não implementado (Not Implemented)
 */
$router->group("error")->namespace("Test");
$router->get("/{errcode}", "Stonk:notFound");

/**
 * Este método executa as rotas
 */
$router->dispatch();

/*
 * Redireciona todos os erros
 */
if ($router->error()) {
    $router->redirect("/error/{$router->error()}");
}

Nomeado

<?php
require __DIR__ . "/../vendor/autoload.php";

use Stonks\Router\Router;

$router = new Router("https://www.seudominio.com");

/**
 * Rotas
 * O controlador deve estar no namespace Test\Controller
 */
$router->namespace("Test")->group("name");

$router->get("/", "Name:home", "name.home");
$router->get("/hello", "Name:hello", "name.hello");
$router->get("/redirect", "Name:redirect", "name.redirect");

/**
 * Este método executa as rotas
 */
$router->dispatch();

/*
 * Redireciona todos os erros
 */
if ($router->error()) {
    $router->redirect("name.hello");
}

Exemplo de controlador nomeado

class Name
{
    // ...

    public function __construct($router)
    {
        $this->router = $router;
    }

    public function home(): void
    {
        echo "<h1>Home</h1>";
        echo "<p>", $this->router->route("name.home"), "</p>";
        echo "<p>", $this->router->route("name.hello"), "</p>";
        echo "<p>", $this->router->route("name.redirect"), "</p>";
    }

    public function redirect(): void
    {
        $this->router->redirect("name.hello");
    }
}

Parâmetros nomeados

// Rota
$router->get("/params/{category}/page/{page}", "Name:params", "name.params");

$this->router->route("name.params", [
    "category" => 22,
    "page" => 2
]);

// Resultado
https://www.{}/name/params/22/page/2

$this->router->route("name.params", [
    "category" => 22,
    "page" => 2,
    "argument1" => "most filter",
    "argument2" => "most search"
]);

// Resultado
https://www.{}/name/params/22/page/2?argument1=most+filter&argument2=most+search

currentRoute

Obtém a url da rota que foi executada. Exemplo: https://www.{}/contato.

$router->get('/perfil', 'Controller:profile');
$router->get('/contato', 'Controller:contact'); // Exemplo: esta foi a rota executada

$router->currentRoute();

isCurrentRoute

Retorna true se a rota que foi executada possui o name especificado no parâmetro. False, caso contrário. Para utilizar este método, é obrigatório nomear a rota que deseja validar.

$router->get('/perfil', 'Controller:profile', 'controller.profile');
$router->get('/contato', 'Controller:contact', 'controller.contact'); // Exemplo: esta foi a rota executada

if($router->isCurrentRoute('controller.contact')){
  echo 'A rota contato foi executada';
}

Callable

/**
 * GET httpMethod
 */
$router->get("/", function ($data) {
    $data = ["realHttp" => $_SERVER["REQUEST_METHOD"]] + $data;
    echo "<h1>GET :: Spoofing</h1>", "<pre>", print_r($data, true), "</pre>";
});

/**
 * POST httpMethod
 */
$router->post("/", function ($data) {
    $data = ["realHttp" => $_SERVER["REQUEST_METHOD"]] + $data;
    echo "<h1>POST :: Spoofing</h1>", "<pre>", print_r($data, true), "</pre>";
});

/**
 * PUT spoofing e httpMethod
 */
$router->put("/", function ($data) {
    $data = ["realHttp" => $_SERVER["REQUEST_METHOD"]] + $data;
    echo "<h1>PUT :: Spoofing</h1>", "<pre>", print_r($data, true), "</pre>";
});

/**
 * PATCH spoofing e httpMethod
 */
$router->patch("/", function ($data) {
    $data = ["realHttp" => $_SERVER["REQUEST_METHOD"]] + $data;
    echo "<h1>PATCH :: Spoofing</h1>", "<pre>", print_r($data, true), "</pre>";
});

/**
 * DELETE spoofing e httpMethod
 */
$router->delete("/", function ($data) {
    $data = ["realHttp" => $_SERVER["REQUEST_METHOD"]] + $data;
    echo "<h1>DELETE :: Spoofing</h1>", "<pre>", print_r($data, true), "</pre>";
});

$router->dispatch();

Falsificador de formulário (Spoofing)

Esse exemplo mostra como acessar as rotas (PUT, PATCH, DELETE) a partir da aplicação. Você pode ver mais detalhes na pasta de exemplo. Dê uma atenção para o campo _method, ele pode ser do tipo hidden.

<form action="" method="POST">
    <select name="_method">
        <option value="POST">POST</option>
        <option value="PUT">PUT</option>
        <option value="PATCH">PATCH</option>
        <option value="DELETE">DELETE</option>
    </select>

    <input type="text" name="first_name" value="Giovanni"/>
    <input type="text" name="last_name" value="Oliveira"/>
    <input type="text" name="email" value="giovanni.al.oliveira@gmail.com"/>

    <button>Stonks</button>
</form>

Exemplo de PHP cURL

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://localhost/stonks/router/exemple/spoofing/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "first_name=Giovanni&last_name=Oliveira&email=giovanni.al.oliveira@gmail.com",
  CURLOPT_HTTPHEADER => array(
    "Cache-Control: no-cache",
    "Content-Type: application/x-www-form-urlencoded"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "Error cURL #:" . $err;
} else {
  echo $response;
}

Contribuindo

Envie relatórios de bugs, sugestões e solicitações de pull para o rastreador de problemas do GitHub.

Suporte

Se você descobrir algum problema relacionado à segurança, use o rastreador de problemas do GitHub.

Agradecido (õ.~)

Licença

A Licença do MIT. Por favor, veja o Arquivo de Licença para maiores informações.