一个简单的PHP路由组件

v2.0.0 2022-01-16 06:01 UTC

This package is auto-updated.

Last update: 2024-09-29 06:20:22 UTC


README

该项目是一个简单的PHP路由组件。我创建这个项目是为了理解路由管理器的功能。该项目基于coffeecode/router,这是一个我在其他项目(此处GitHub上发布)中使用的专业项目。

安装

composer require yuri-oliveira/router

如何使用

Apache

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ./index.php [QSA,NC]
</IfModule>

构造函数

<?php

use YuriOliveira\Router\Request;
use YuriOliveira\Router\Response;
use YuriOliveira\Router\Router;

require_once(__DIR__ . '/vendor/autoload.php');

define('SITE', [
    'root' => 'https:///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']);

路由

// 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]); }

可调用

$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');

分组

分组基本上是前缀。在定义分组之后创建的路由将位于该分组内,直到分组更改或设置为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');

重定向

重定向是通过接收路由名称、路径或完整URL的方法redirect完成的。

$router->redirect('web.home');
$router->redirect('/postagens/tecnologia/55214');
$router->redirect('http://www.site.com/home');

控制器

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();
    }
}

响应

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();
    }
}

视图

<!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>

要求

PHP 8.0或更高版本