Coder Social home page Coder Social logo

robsonvleite / router Goto Github PK

View Code? Open in Web Editor NEW
173.0 173.0 39.0 39 KB

A classic CoffeeCode Router is easy, fast and extremely uncomplicated. Create and manage your routes in minutes! (Crie, gerencie, agrupe e execute manipuladores ou controladores com transporte de dados via rotas da aplicação)

Home Page: https://www.upinside.com.br

License: MIT License

PHP 100.00%

router's People

Contributors

robsonvleite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

router's Issues

Adição das Psr-7 e Psr-15

Olá, venho por está issue dar a sugestão de adição das psrs/Interfaces 7 e 15, que são amplamente utilizadas por frameworks como Laravel. Está adição seria de grande ajuda para podermos escrever Testes nesse pacote(para facilitar a manutenção), e também ajudaria aos dependentes do pacote a testar suas aplicações(Algo parecido com o teste de feature que o laravel disponibiliza), pois isso seria facilitado com a PSR-15 implementada. Segue alguns links abaixo:

PSR-7: https://www.php-fig.org/psr/psr-7/
PSR-15: https://www.php-fig.org/psr/psr-15/

Suporte a middlewares

Precisa melhorar as questões dos middlewares, não está com o funcionamento correto.

404

Criei todo o meu projeto em localhost, ao passar pro servidor, me deparo com o erro 400, na minha localhost ele funciona normalmente, já em meu servidor ele me mostra o 400.

Existe alguma forma de resgatar o nome da rota ou nome dela?

Olá pessoa, estou com um projeto que tenho a necessidade de permissões por rota, e pra isso uso o nome da rota ou url no meu banco de dados para dar permissão.

Existe alguma maneira de dar um "$route->getRoute()" ou "$route->getName()" para obter o nome da rota?

Caso nao tenha, seria legal criar um método onde conseguimos obter o nome das nossas rotas e até mesmo os grupos a qual pertencem.

Obrigado.

Windows funciona mas no linux causa ERR_TOO_MANY_REDIRECTS

ERRO 400

index.php

<?php
require_once __DIR__ . '/vendor/autoload.php';

use CoffeeCode\Router\Router;

$router = new Router(URL_SITE);
$router->namespace("App\Controller");

// ROUTERS
$router->group(null);
$router->get("/", "Routers:pageHome");

// ERROR ROUTERS
$router->group("erro");
$router->get("/{error_code}", "Routers:pageError");

// RUN ROUTERS
$router->dispatch();

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

composer.json

{
    "name": "wilian/xx-system",
    "description": "xxxx",
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "config.php",
            "db.php"
        ]
    },
    "authors": [
        {
            "name": "Wilian M."
        }
    ],
    "require": {
        "coffeecode/router": "1.0.*"
    }
}

routers.php que fica na pasta app/controller

<?php

namespace App\Controller;

class Routers
{
	public function pageHome()
	{
		return false;
	}

	public function pageError($error)
	{
		$arr['status'] = false;
		$arr['error'] = $error['error_code'];

		header('Content-Type: application/json');

		echo json_encode($arr);
	}
}

config.php

<?php
// HORARIO DO SERVIDOR
date_default_timezone_set('America/Sao_Paulo');

// URL DO SITE SEM A BARRA NO FINAL
define('URL_SITE', 'https://xx.dominio.com');

// BANCO DE DADOS
define('DB_HOST', 'localhost');
define('DB_USER', 'xx');
define('DB_PASS', 'xx');
define('DB_DBNAME', 'xx');

// HEADERS CACHE
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0');
header('Pragma: no-cache');

ERR_TOO_MANY_REDIRECTS (erro 400)

Estou com um problema de ERR_TOO_MANY_REDIRECTS (erro 400), a rota fica sempre direcionada para o erro e fica em loop infinito.

Já vi todos os comentários do vídeo "ROTAS, CALL BACKS E ESTRUTURA MVC COM ROUTER | PHP TIPS 004", entrei em fóruns e até no seu blog e não encontrei a solução. Fiz todas as configurações corretamente e exatamente como é feito no primeiro vídeo da série.

Preciso de ajuda com isso para prosseguir com os estudos!

Config.php

define("URL_BASE", "http://localhost/php-tips/ep002");

Web.php

namespace Source\App;

class Web {

    public function __construct() {}

    public function home($data){
        echo "<h1>Home!</h1>";
        var_dump($data);
    }

    public function contact($data){
        echo "<h1>Contato!</h1>";
        var_dump($data);
    }

    public function error($data){
        echo "<h1>Erro! {$data["errcode"]}</h1>";
        var_dump($data);
    }

}

index.php

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

use CoffeeCode\Router\Router;

$router = new Router(URL_BASE);

/**
 * Controllers
 */
$router->namespace("Source/App");

/**
 * WEB
 * home
 */
$router->group(null);
$router->get("/", "Web:home");

/**
 * ERRORS
 */
$router->group("ooops");
$router->get("/{errcode}", "Web:error");

$router->dispatch();

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

Documentação

Falta informar na documentação como é passado um parâmetro 'não obrigatório', isso é importante.

Erro de redirecionamento com dados.

Ao redirecionar usando o método redirect os dados não são passados para o método do controlador da rota (o array de dados chega vazio). Segue trecho de código abaixo demonstrando:

public function register(array $data): void {
    echo $this->view->render("web/auth/register", $data);
}

public function handleRegister(): void {
    if (!$_POST["name"] || !$_POST["email"] || !$_POST["password"]) {
        $this->redirectWithError("/register", "Informe todos os dados.");
    } else {
        $data = (object) filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
        $users = (new User())->find("email = :email", "email={$data->email}")->count();
        if ($users) {
            $this->redirectWithError("/register", "Já existe um usuário cadastrado com o e-mail informado.");
        } else {
            $user = new User();
            $user->name = $data->name;
            $user->email = $data->email;
            $user->password = password_hash($data->password, PASSWORD_DEFAULT);
            $user->save();

            if ($user->fail()) {
                $this->redirectWithError("/register", "Erro ao cadastrar-se, tente novamente.");
            } else {
                $this->router->redirect("/app/home");
            }
        }
    }
}

public function redirectWithError(string $route, string $error) {
    var_dump($error);
    $this->router->redirect($route, ["error" => $error]);
}

readfile() com erro

Estou tentando zipar alguns arquivos para download, mas tanto o arquivo zip quanto arquivos soltos são baixados com erro. Ainda vale dizer que no servidor o zip está lá perfeito. Acredito que o problema seja a não permissão de acesso, mas não consegui editar o .htaccess para que funcione. Existe algo além disso dentro do router?

Capturar os inputs em uma rota GET

Bom dia, tenho um formulario para filtrar os dados. Quando eu faço o submit do formulario para uma rota usando o metodo POST, no controlador eu consigo acessar os dados na variavel $data. Porém se eu mudo o metodo para GET, o array $data chega null.

Será que estou fazendo algo errado?

Para contornar, incluir o trecho de código abaixo no metodo formSpoofing da classe Dispatch, ainda estou testando, mas aparentemente funcionou.

if ($this->httpMethod == "GET") {
$queryString = filter_var(str_replace('?', "", strstr($_SERVER['REQUEST_URI'], "?")), FILTER_SANITIZE_STRIPPED);
parse_str($queryString, $data);

        $this->data = $data;

        unset($this->data["_method"]);
        return;
    }

Propertie $path from RouterTrait with php port

hi, my i'm rodolfo and i used this router. but when the server use port like: 8080 or other, the $path from Dispatch class not work with INPUT_GET.
then, i tried fix-it and inserted this code:

``
//new code
$port = (filter_input(INPUT_SERVER, "SERVER_PORT", FILTER_DEFAULT) ?? "");
$port = strpos($_SERVER['HTTP_HOST'], $port) ? $port : "";
// end new code
$this->projectUrl = (substr($projectUrl, "-1") == "/" ? substr($projectUrl, 0, -1) : $projectUrl);

    if($port) {
        $this->patch = (filter_input(INPUT_SERVER, "REQUEST_URI", FILTER_DEFAULT) ?? "/");
    }else{
        $this->patch = (filter_input(INPUT_GET, "route", FILTER_DEFAULT) ?? "/");
    }

    $this->separator = ($separator ?? ":");
    $this->httpMethod = $_SERVER['REQUEST_METHOD'];``

maybe this can by fix-it in the .htaccess! ?

URL amigável no view

Busquei na documentação e não encontrei, no view assumo uma url passando parâmetro que vem do banco com datalayer:

<?php echo "<a href='{$router->route('web.faq', ['category'=>$category['denomination']])}'>Categoria FAQ</a>"; ?>

e o link será site.com/faq?category=anycategory

Para a URL amigável fica feio, e não consigo passar o category como parte da URL em si, ex:
site.com/faq/anycategory

A rota em index.php: $router->get("/faq/{category}", "Web:faq", "web.faq");

Tentei feito o Laravel mas não obtive resultados, observei o código da classe, e não entendi como enviar para a rota a url desse modo.

Me dá um help, não sei onde recorrer para o suporte do componente.

Retornando imagens

Valos lá. Com essa biblioteca eu criei uma api, e nessa api eu faço uploads de imagens, para uma pasta interna chamada 'uploads', queria saber como eu faço para retornar essa imagem para ser usada em um front, pois na documentação não fala nada a respeito.
Na verdade seria bom retornar qualquer outro tipo de arquivo, isso é muito útil.

HEAD method is not supported

The HEAD method is important to check if links are correct or if the cache of certain resources continues
valid. I will work on this issue.

Rota com falha

Ao acessar uma rota que o nome de uma página interna (uri) seja igual o nome da rota, o valor do $_GET URI vem null!

O que será que pode ser?

Deploy heroku

Ao executar localmente, as rotas estão funcionando corretamente, porém, ao fazer o deploy no heroku, não está funcionando, caso já tenha passado por algum tipo de problema semelhante, sabe me dizer o q pode estar ocorrendo?

Middleware

Como faço para executar um método ou mais de autenticação / autorização antes de cada rota demarcada? Seria algo como um middleware

Redirecionamento

Estou passando para a rota no index o id com a tag {id} mas quando passo pra rota
assim route("app.cadastroimoveis")."/{$value->id}" ; ?> ele cria assim http://localhost/projetos/Proda-Lcdpr_n/imoveis/cadimoveis/%7Bid%7D/3 e se eu coloco assim route("app.cadastroimoveis")."{$value->id}" ; ?>
ele cria http://localhost/projetos/Proda-Lcdpr_n/imoveis/cadimoveis/%7Bid%7D3 e dai na pagina eu tive que colocar uma função somente numeros pra pega o id que eu quero , só que acho que ta errado, no index eu coloco assim
$route->group("imoveis");
$route->get("/cadimoveis/{id}","App:cadastroImoveis","app.cadastroimoveis");

o que estou fazendo de errado ?

Rota e valor do parâmetro

Olá, boa tarde.
Estou tentando acessar uma rota com parâmetros, como exemplo abaixo.

Rota de acesso:
http://sistema.test/administrador/usuario/endereco/cadastro/{tipocadastro}/{id}

Rota de acesso com valor no parâmetro:
http://sistema.test/administrador/usuario/endereco/cadastro/usuario/2

Retorno da Array $data:
[tipocadastro] => 2 [id] =>

Estou tendo problema para passar o valor usuario no parâmetro, porque já consta na rota a palavra usuario.
O valor usuario esta sendo ignorado, então tipocadastro pega o valor do id, e o valor do id fica null.

Estou usando a versão 1.0

Bug no router

Ao utilizar rota nomeada com o metódo delete, não está substituindo os parâmetros. Ex:
$router->route('[email protected]', ['id'=>3]) // correto : /app/finance/conta/3 // erro: /app/finance/conta/{id}?id=3;

Permitir passar valores pelo router. Capturar no Middleware.

Seria ótimo se o Router pudesse passar valores e esses valores serem capturado em no Middleware.

Contexto:
Quero limitar a cada roda segundo a permissão de acesso de cada usuário. Pois tem usuário que pode acessar determinada página e outros não.

Então podendo fazer algo como:
$router->get("/cartas", "Cartas:lista", "cartas.lista", ["cartaLista"]);

estaria passando o valor "cartaLista".

Algo curto, para não poluir visualmente o código.

Ai no Middleware faria algo como, para pagar esse valor "cartaLista", passado pelo router:

<?php

namespace App\Http;

class Check
{
    public function class(string $permissao)
    {
        $partes = explode(",", $_SESSION['permissoes']); //inicio,cartaLista,cartaAdicionar, ...

       //Verifica se a página de acesso vinda da variável $permissao está dentro de $partes.
        if (!in_array($permissao, $partes)) {
            //vai para algum lugar
            exit;
        }
    }
}

Error PHP8 - CoffeeCode - Router

No ultimo uptade, comecou a ocorrer o seguinte erro.

PHP Fatal error: Uncaught TypeError: CoffeeCode\Router\Dispatch::handler(): Argument #2 ($namespace) must be of type string, null given, called in /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/RouterTrait.php on line 52 and defined in /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/RouterTrait.php:170
Stack trace:
#0 /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/RouterTrait.php(52): CoffeeCode\Router\Dispatch->handler(Object(Closure), NULL)
#1 /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/RouterTrait.php(59): CoffeeCode\Router\Dispatch->CoffeeCode\Router{closure}()
#2 /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/Router.php(38): CoffeeCode\Router\Dispatch->addRoute('GET', '', Object(Closure), NULL, NULL)
#3 /shared/httpd/mobbilizanew/htdocs/index.php(14): CoffeeCode\Router\Router->get('/', Object(Closure))
#4 {main}
thrown in /shared/httpd/mobbilizanew/htdocs/vendor/coffeecode/router/src/RouterTrait.php on line 170

Criando sub dominio

Como configurar o sub domínio para carregar uma rota específica?

https://dashboard.meudominio.com.local

/**
* Home page
*/
$router->group(null);
$router->get("/", "Web:home");
$router->get("/contact", "Web:contact");


/**
* Painel do sistema
*/
$router->group("dashboard");
$router->get("/", "Dashboard:login");
$router->get("/home", "Dashboard:home");

nginx

You described how this works with apache. But how to configure with nginx?

Comportamento inesperado ao executar requisições na rota raiz quando os métodos GET e POST estão definidos na mesma.

Certo dia me deparei com um problema que levei um tempinho para entender.

Se na rota inicial (primária = null) for definido outro método junto de get(), por exemplo post(), quando uma requisição é feita na rota que não seja get(), ou seja, o post() citado acima, a rota do método get() também é executada.

$router->group(null);
$router->get('/', 'Web:login', 'web.login');
$router->post('/', 'Web:login', 'web.login');

Isso acontece devido a criação das rotas com/sem barra

https://localhost/meusite
https://localhost/meusite/

No final, ele executa o método diferente de get() na rota sem barra e, logo em seguida, executa o método get() na rota com /. isto também ocasiona falha na rota de post() e não é possível recuperar nenhuma informação do backend.

Abraços.

Problema na função route

A função route em certas ocasiões não tem o comportamento esperado. Se tiver alguma rota definida da seguinte forma:

$router->group('me');
$router->get("/", "Website:login", "website.login");
$router->get("/{msg}", "Website:login", "website.login");
$router->get("/registrar", "Website:register", "website.register");
$router->get("/recuperar", "Website:forget", "website.forget");
$router->get("/resetar", "Website:reset", "website.reset");

Ao executar a funçao route

$router->route("website.login", ["msg" => "bar"]);

A url gerada pela mesma é a seguinte "http://foo.com/me/?msg=bar", ao inves de "http://foo.com/me/bar"

Nginx não funciona

Olá o router não renderiza as rotas, usando o nginx, o código informado na documentação não funciona, alguém conseguiu fazer funcionar?

Abs

Feature de Middleware

@robsonvleite o que acha de implementarmos uma feature de middleware?

Eu acho que seria ótimo para não precisar ficar poluindo o __construct do controller ou fazendo adaptações nas próprias rotas.

Aproveitando pra dizer que esse projeto é maravilhoso, eu já usei em diversos projetos aqui quando não uso Laravel.

Muito prático e rápido!!!

Não é possível criar subgrupos?

$router->group('app');
$router->get('/', 'App:home', 'app.home');
$router->get('/logout', 'App:logout', 'app.logout');

$router->group('app/configs');
$router->get('/', 'Config:home', 'config.home');

Avaliando o código, vi que na função group() há um str_replace() que remove toda barra do valor inserido como parâmetro da função, transformando app/configs em appconfigs. Sei que bastaria fazer conforme abaixo que eu teria o mesmo resultado.

$router->group('app');
$router->get('/', 'App:home', 'app.home');
$router->get('/logout', 'App:logout', 'app.logout');
$router->get('/configs', 'Config:home', 'config.home');

Mas seria interessante ter, se não houver, uma função para criar subgrupos ou poder configurar da forma abaixo. Seria mais para questão de deixar mais explicito e organizado o código final.

$router->group('app');
$router->group('app/configs');

Variável de idioma

Como faço para incluir uma vaiável que será o idioma do sistema.

Exemplo:

/**
* Home page
*/
$router->group("{lang}"); //pt-br, en, es
$router->get("/", "Web:home");
$router->get("/contact", "Web:contact");

Essa parte acima funciona bem, o acesso fica certinho.

https://local.dev/pt/
https://local.dev/pt/contact

Agora quando vou acessar outro local como: https://local.dev/pt/dashboard/

/**
* Painel do sistema
*/
$router->group("dashboard");
$router->get("/", "Dashboard:login");
$router->get("/home", "Dashboard:home");

Sempre vai para a tela de erro:

https://local.dev/ops/404

Comportamento estranho do router ao utilizar junto ao Hestia Panel

Percebi um comportamento estranho ao utilizar o router junto ao Hestia panel. Meu código funciona perfeitamente no ambiente local (xampp), mas quando utilizo em uma maquina linux com o painel hestia configurado as rotas param de funcionar. O mais interessante é que rotas simpes ex: meusite.com/exemplo funciona mas rotas agrupadas não funcionam ex: meusite.com/json/response. No ambiente local funciona normalmente, tanto no xampp quanto em uma vm linux rodando apache e php. Posso simplesmente usar o apache configurado na mão mas o hestia facilita muito as coisas.

OBS: Testei tudo com php 8.0 e 8.1.

Tem alguma dica?

Router quebra fora de ordem

Esses dias estava brincando com o Router quando percebi que se iniciar ele "fora de ordem" certas coisas não funcionam muito bem. Por exemplo:

$router = new \CoffeeCode\Router\Router('http://localhost/debug');
$router->namespace('Source\Controllers');

$router->group('app');
$router->get('/', 'App:home', 'app.home');
$router->get('/logout', 'App:logout', 'app.logout');

$router->group(null);
$router->get("/", "Website:home", "website.home");
$router->get("/{search}", "Website:search", "website.search");
$router->get("/contato", "Website:contact", "website.contact");

Se iniciado dessa forma, ao tentar acessar a url "http://localhost/debug/app", ao invés de ir para "App.home", vai para "Website.search".

Rotas apontando sempre pra " / "

Instalei o php no disco e subi o servidor com php -S localhost:8080 . Quando passo rotas como localhost:8080/sobre /localhost:8080/blog qualquer rota além de localhost:8080 ele sempre aponta pro home.

codigo do index:

`$router->namespace("source\Controllers");

$router->get("/", "Home:Index");
$router->get("/sobre", "Home:sobre");

$router->dispatch();`

Middleware e controller

Boa noite, é possível enviar um objeto da middleware para o controller?

A ideia seria verificar o usuário com a middleware e se encontrar enviar para o controller os dados desse usuário para que não seja necessário refazer isso no controller novamente, é possível? Se sim como posso enviar esses dados???

Desde já agradeço a ajuda

Testes automatizados

Este projeto precisa de testes automatizados, talvez possamos escrever juntos, isto previni muitos problemas, como o caso dos problemas com os middlewares.

Como capturar somente o SLUG da ROTA?

Fala Robson, tudo bom?
Estou usando seu coffeecode/router e queria ver com você como eu pegaria o slug da rota sem fazer pregh_match ou algo do tipo... Existe alguma forma "mais amigável" aqui no seu repositório hoje?

EX
image

Middleware Group para login (sessão)

Como fazer um Middleware Group, para que a pessoa não consiga acessar se não estiver logada. Ou apenas verificar se uma sessão existe. Se não existir joga para a tela de login.

Enviar um exemplo pratico?

Controller error

Em quanto uso callback, funciona, mas quando eu chamo um método lá no controller, nada aparece na tela

Melhorias no router

É necessário poder alterar os dados recebidos no controller via router. Ao usar o middleware devia ser possível alterar os dados que serão recebidos posteriormente pelo controller na camada de Middleware.
Ex:

  • Na camada de middleware: $router->current()->data['data] = 'test';
  • Na camada do controller: metodo(array $data) { echo $data['data']; // 'test' }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.