bonuscred / api-manager
处理HTTP请求和响应的API服务器管理器
v2.0.8
2024-07-17 17:26 UTC
Requires
- php: >=8.0
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或更高版本