yuri-oliveira / router
Um simples componente de rotas PHP
v2.0.0
2022-01-16 06:01 UTC
Requires
- php: >=7.4
This package is auto-updated.
Last update: 2025-03-29 01:02:52 UTC
README
Esse projeto é um simples componente de rotas PHP. Fiz esse projeto para entender o funcionamento de um gerenciador de rotas. Tive como base o coffeecode/router que é um projeto profissional que uso em outros projetos postados aqui mesmo no github.
Instalação
composer require yuri-oliveira/router
Como usar
Apache
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ ./index.php [QSA,NC] </IfModule>
Construtor
<?php use YuriOliveira\Router\Request; use YuriOliveira\Router\Response; use YuriOliveira\Router\Router; require_once(__DIR__ . '/vendor/autoload.php'); define('SITE', [ 'root' => 'http://localhost/yuri-oliveira-router' ]); $request = new Request( $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_FILES, $_GET, $_POST, getallheaders() ); $response = new Response(); $router = new Router($request, $response, SITE['root']);
Rotas
// Definindo o namespace dos Controllers $router->namespace('YuriOliveira\Router\Controllers') // Exemplo de rotas simples $router->get('/home', 'WebController:home', 'web.home'); $router->post('/registrar', 'WebController:register', 'web.register'); // Exemplo de rotas com parâmetros dinâmicos $router->get('/usuarios/:user', 'WebController:showUser', 'web.showUser'); $router->post('/usuarios/deletar/:user', 'WebController:deleteUser', 'web.deleteUser'); // Rota dinâmica para receber os erros de requisição $router->get('/oops/:errorcode', 'App:error', 'app.error'); // Método que faz a classe trabalhar $router->dispatch(); if ($error = $router->error()) { $router->redirect('app.error', ['errorcode' => $error]); }
Callable
$router->get('/', function(Router $router, array $data, ResponseInterface $response){ $response->addContent('Olá mundo!')->sendResponse(); }, 'web.home'); $router->post('/registrar', function(Router $router, array $data, ResponseInterface $response){ $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED); $user = new User(); $user->name = $data['name']; $user->email = $data['email']; $user->password = password_hash($data['password'], PASSWORD_DEFAULT); $user->save(); }, 'web.register');
Grupos
Os grupos são basicamente prefixos. As rotas criadas depois da definição do grupo estarão dentro do grupo até que o grupo mude ou seja setado como null.
$router->group('/admin'); $router->get('/perfil', 'AdminController:adminProfile', 'admin.adminProfile'); $router->post('/relatorio', 'AdminController:report', 'admin.report'); $router->group('/usuarios'); $router->get('/:user', 'WebController:showUser', 'web.showUser'); $router->post('/deletar/:user', 'WebController:deleteUser', 'web.deleteUser'); $router->group(null); $router->get('/home', 'WebController:home', 'web.home'); $router->post('/contatos', 'WebController:contacts', 'web.contacts');
Redirecionar
O redirecionamento é feito usando o método redirect que recebe o nome da rota, um path ou uma url completa.
$router->redirect('web.home'); $router->redirect('/postagens/tecnologia/55214'); $router->redirect('http://www.site.com/home');
Controller
class WebController { protected Router $router; public function __construct($router) { $this->router = $router; } public function showUsers($data, ResponseInterface $response): void { $users = User::find()->all(); $response->addContent(print_r($data))->sendResponse(); } }
Response
class WebController { protected Router $router; public function __construct($router) { $this->router = $router; } public function showUsers($data, ResponseInterface $response): void { // O status da resposta. O status 200 já é o padrão $response->setStatusHttp(200); // Conteúdo a ser enviado como resposta $response->addContent(mixed $content); // Tipo do conteúdo a ser enviado como resposta. O ContentType 'text/html' já é o padrão $response->setContentType('text/html'); // Definindo Headers da resposta // O header Content-Type é informado automaticamente usando o setContentType informado $response->addHeader(string $key, string $value); // Enviando resposta para o browser $response->sendResponse(); } }
View
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <a href="<?= $router->route('web.showUser', ['user' => 1]) ?>">Usando as rotas</a> <!-- retornaria "http://www.site.com/usuarios/1" --> </body> </html>
Requisitos
PHP 8.0 ou superior