bonuscred/api-manager

处理HTTP请求和响应的API服务器管理器

v2.0.8 2024-07-17 17:26 UTC

This package is auto-updated.

Last update: 2024-09-17 17:51:26 UTC


README

用于处理HTTP请求和响应的API管理器。

安装

要安装此依赖项,请执行以下命令

composer require bonuscred/api-manager

配置

Apache

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
	
	#Main Redirect	
    RewriteRule ^ index.php [NC,L,QSA]
</IfModule>

使用

应用

$app = new ApiManager\Server\App;

$app->use('/', function(){
    echo 'Hello World';
});

$app->get('/some-get-route', function($req, $res){
    echo 'Call GET: /some-get-route';
});

$app->post('/some-post-route', function($req, $res){
    echo 'Call POST: /some-post-route';
});

$app->all('/some-route', function($req, $res){
    echo 'Call: /some-route';
});

$app->run();

钩子

钩子方法提供在执行过程中的数据处理和操作的灵活性。

$app = new ApiManager\Server\App;

$cont = $app->use('/', function(){});
$cont->onStart(function($req, $res){
    //Executa callback antes da execução do container
});
$cont->onSuccess(function($req, $res){
    //Executa callback se o container resolveu com sucesso
});
$cont->onError(function($req, $res, $err){
    //Executa callback se o container encontrou algum erro
    //$err é uma extensão de Throwable   
});
$cont->onResolved(function($req, $res){
    //Executa callback ao finalizar container  
});

别名

在迁移输入前缀时,使用别名可以在多个输入前缀上保持容器的相同行为。

$app = new ApiManager\Server\App;

$app->use('/api', function(){})
    ->alias('/oldapi');

重定向

客观地将请求重定向到其他URL。

$app = new ApiManager\Server\App;

$app->redirect('/path/to/be/redirected', 'https://google.com.br', 302);

路由

// Recebe como parâmetro um boleano(true como valor padrão) 
// para informar se o router deve resolver apenas a primeira rota encontrada
// ou todas as rotas compatíveis com o método e url
$router = new ApiManager\Context\Router\Router(true);

$router->get('/myroute', function($req, $res, $args){
            $response->status(200)
                    ->json(['success' => true]);
        });
$router->post('/my-post-route', [MyController::class, 'index']);
//Só execetada se router permitir execução de todas as correspondências
$router->get('/myroute', [MyController::class, 'index']);

$app = new ApiManager\Server\App;
$app->use('/', $router);
$app->run();

路由组

可以通过前缀对路由进行分组,并应用全局条件到组中的所有路由。

$router = new ApiManager\Context\Router\Router(true);

$router->group('/mygroup', function($group){
    //Executa um callback para chamadas com método GET do grupo
    $group->map('GET', '/', function($req, $res, $args){
        $req->setBodyParam('method_get_on_group', true);    
    });

    $group->get('/myroutegroup', ['MyController', 'index']);
    $group->post('/myroutegroup', ['MyController', 'index']);
    
    //Adiciona rota com Middlaware dentro do grupo
    $group->get('/myroutegroup/{id}', ['MyController', 'index']);
    // Passando middleware global para todas as rotas do grupo
    $group->middleware(MyMiddleware::class);
});

中间件

创建中间件

必须实现MiddlewareExtension接口。

next()函数负责执行队列中的下一个中间件,如果不需要执行任何中间件,可以省略它,路由流将继续到控制器。

<?php

use ApiManager\Extension\MiddlewareExtension;
use ApiManager\Http\Request;
use ApiManager\Http\Response;

class MyMiddleware implements MiddlewareExtension{
    
    public function handle(Request $req, Response $res, \Closure $next){
        $authorization = $req->getHeaderLine('Authorization');

        if(!$authorization){
            throw new Exception('Header Authorization não enviado.');
        }

        //Executa o próximo middleware da fila
        $next($req, $res);
    }
}

注入中间件

中间件可以在路由的多个层级中使用。

$router = new ApiManager\Context\Router\Router;

//Middleware global para todas as rotas
$router->middleware(MyMiddleware::class);

//Middleware em rota específica
$router->get('/myroute', ['MyController', 'index'], [MyMiddleware::class]);

$router->group('/mygroup', function($group){
    //Middleware global para todas as rotas do grupo
    $group->middleware(MyMiddleware::class);
    
    //Middleware em rota específica do grupo
    $group->get(
        '/myroutegroup/{id}', 
        ['MyController', 'index'], 
        [MyMiddleware::class]
    );    
});

回调

所有回调将接收两个对象:Request和Response,分别包含服务器输入信息和客户端请求输出信息。

控制器

控制器应作为可调用函数实现,接收参数:Request、Response和$args。$args包含一个索引数组,包含所有输入数据(查询、主体、URL和中间件)。

匿名函数

<?php

use ApiManager\Http\Request;
use ApiManager\Http\Response;

function meuControlador(Request $req, Response $res, $args){
    $args['route_path']   = $req->originalUrl();
    $args['route_method'] = $req->httpMethod();
    
    $res->status(200)->json($args);
}

实现ControllerExtension

<?php

use ApiManager\Extension\ControllerExtension;
use ApiManager\Http\Request;
use ApiManager\Http\Response;

class MyController implements ControllerExtension{
    
    public static function index(Request $req, Response $res, $args = []){
        $args['route_path']   = $req->originalUrl();
        $args['route_method'] = $req->httpMethod();
        
        $res->status(200)->json($args);
    }

}

要求

  • 需要PHP 8.0或更高版本