jordan/http-routes

友好的http路由器

0.1.1 2022-08-15 19:16 UTC

This package is auto-updated.

Last update: 2024-09-16 00:03:00 UTC


README

关于

"http-routes" 是一个http路由器,通过url识别路由并通过控制器或回调响应请求。

版权

亮点

  • 易于与MVC架构集成
  • 无依赖
  • 用户友好的URI
  • 中间件
  • 接受可选和必选参数
  • 简单易用

通过Composer安装

composer jordan/http-routes

开始

创建一个用户可以通过您的网站访问的文件。建议创建一个 "index.php",因为服务器会在访问网站根目录时自动调用它。

在创建的文件中,启动自动加载,然后创建一个文件,该文件将负责启动 "HttpRoutes\Routes" 和 "HttpRoutes\Bootstrap" 的实例。

//index.php
require_once "/vendor/autoload.php";
require_once "foo/bar/arquivo-rotas-exemplo.php";
//arquivo-rotas-exemplo.php
use HttpRoutes\{Route, Bootstrap};
use HttpRoutes\Exception\BootstrapException;

$route = new Route;


//Insira suas rotas aqui


try {
  //Iniciando a aplicação
  $app = new Bootstrap($route, "http:\\url-base-projeto");

} catch (BootstrapException $e) {
  //Erros relacionados à rota
  http_response_code($e->getCode());
  if ($e->getCode() == 404 | $e->getCode() == 405) {
    //Erros causados pelo usuário
    die($e->getMessage());
  } else {
    //Erros internos
    die("Ocorreu um erro inesperado, lamentamos o ocorrido.<br>Detalhes DEBUG: '{$e->getMessage()}'");
  }
}

方法

以下方法的示例将假设您已经完成了上述步骤。所有方法都必须通过 "HttpRoutes\Route" 实例调用。

$route
->method();

$route
->method1()
->method2('foo', 'bar');

路由方法

创建一个路由

要创建一个路由,只需调用 "set" 方法,第一个参数应填写路由的http方法,第二个参数应填写所需的路径。

注意:路径开头和结尾的斜杠将被忽略;http方法名称将被转换为大写。

->set('get', 'foo');

->set('post', '/bar');

注意:此函数返回 "HttpRoutes\Route\RouteMethods" 实例,该类包含每个路由的单独方法。

路由参数

路由可以接受额外的参数,这些参数可以在请求时由用户填写。这些参数被分类为 "必需" 和 "可选"。

参数应写成花括号 "{}",其中可选参数应前面加上问号 "{?}"。

注意:必需参数可以后面跟着可选参数,但反之则不太适用。请使用推荐顺序。

->set('get', 'foo/{obrigatório}');//Correto

->set('post', 'foo/{obrigatório}/{?opcional}');//Correto

->set('DELETE', 'foo/{?opcional}/{obrigatório}');//Essa sequência não funciona muito bem

->set('GET', 'foo/{?opcional}/');//Correto

传递给路由的参数将自动传递给负责响应请求的方法。有关详细信息,请参阅 "Callback" 和 "Controller" 部分。

命名一个路由

在需要路由在应用程序的多个地方被调用的场景中,命名一个路由可能很有用。从路由名称可以获取其地址,这允许任何对路由的更改都可以在所有调用它的地方获得,而无需手动更改,因为名称保持不变,只有地址可能发生变化。

->name('Nome-da-rota');
获取命名路由

负责从其名称获取路由的方法将在 "controller" 和 "callback" 方法中可用。

此函数期望两个参数。第一个参数应填写路由名称,第二个参数应填写一个布尔值。默认值为 "true",方法将返回带有基础URL的路由。例如:http://meu-site/rota;如果为 "false",则方法将仅返回命名路由。例如:/rota。

注意:如果不存在命名路由,将在 "BootstrapException" 中抛出异常,提示未找到与名称对应的路由。

$getUriByName('Nome-da-rota', true); //O método retornará a rota antecedida da url base. ex: http://meu-site/rota
$getUriByName('Nome-da-rota', false); //O método retornará somente a rota nomeada. ex: /rota

回调

“回调”方法期望传入一个匿名函数作为参数。该函数将在成功响应HTTP请求时执行。

传入的匿名函数需要准备接收一个数组作为第一个参数,该数组将由应用程序的核心传递。目前只有一个名为“getUriByName”的函数,它负责从各自的名称获取路由(有关详细信息,请参阅“获取命名路由”主题)。即使在不使用这些函数的情况下,该参数也是必需的。

->callback(function($functions){
  return "Resposta a ser retornada";
});

->callback(function($functions){
  $getUriByName = $functions['getUriByName'];
  return $getUriByName('Nome-da-rota'); 
});
回调和路由参数

为了获取用户在请求时通过URL传递的参数,只需将一个变量作为匿名函数的第二个参数传递,该变量将被填充为一个关联数组(键/值)。键将代表每个参数的名称,并包含用户在请求时传递的相应值。对于可选参数,如果没有提供值,则键的值将为null(例如:argumento1=NULL)。

->set('get', 'bar/{obrigatório}')
->callback(function($functions, $params){
  return $params['obrigatório'];
});

->set('get', 'bar/{?opcional}')
->callback(function($functions, $params){
  return !is_null($params['opcional']) ? "parâmetro opcional: {$params['opcional']}" : 'nenhum parâmetro opcional foi informado';
});

控制器

在MVC中,控制器负责响应用户的HTTP请求并发送响应。您可以创建用于每个路由或路由组的控制器。

使用Controller方法可以指定控制器及其方法,它们将负责处理此类请求。不必担心,只需提供一个命名空间,应用程序的核心将为您实例化它。

->controller('Controller', 'action', false)//false, Defaut; O nome do controller será antecedido do namespace App\Controller\
->controller('Foo\Bar\Controller', 'action', true)//O nome do controller será interpretado como um namespace completo

控制器类

每个控制器类都必须有一个构造函数,其第一个参数将被一个数组填充,该数组包含应用程序核心生成的函数列表。要访问函数,只需通过函数名称访问数组的索引。目前仅提供“getUriById”函数。

注意:有关“getUriById”函数的更多详细信息,请参阅上面的“获取命名路由”主题。

//Controller.php
namespace App\Controller;

Class Controller{
  public function __construct($functions)
  {

  }

  public function action()
  {
    return "It's work well, dude!";
  }
}
//Controller.php
namespace Foo\Bar;

Class Controller{
  public function __construct($functions)
  {

  }

  public function action()
  {
    return "It's work well, dude!";
  }
}

控制器中的路由参数

路由参数将以数组的形式作为对应于路由的控制器方法的参数传递。为此,方法需要准备好接收这些值。

注意:有关路由参数的更多详细信息,请参阅上面的“路由参数”主题。

//Controller.php
namespace App\Controller;

Class Controller{
  public function action($args)
  {
    echo '<pre>';
    print_r($args);
    echo '</pre>';
  }
}

中间件

中间件由将在控制器或回调之前执行的指令组成,中间件对于数据验证很有用,并且根据结果,应用程序的流程可以保持或终止。

中间件的方法应返回null以表示成功。如果返回了非null值,则应用程序将终止其流程并显示中间件函数的返回值作为响应。

声明中间件

要声明中间件,只需调用“middleware”函数,该函数期望接收一个数组作为第一个参数,其中索引应与中间件类对应,而值是一个包含类中一个或多个方法的数组。可以提供一个可选的第二参数,其中包含中间件的命名空间,默认命名空间是“App\Middleware”。

注意:中间件总是按照定义的顺序执行。

->middleware(['MiddlewareClass' => ['action'] ]);
->middleware(['MiddlewareClass' => ['action'] ], 'App\Mynamespace\\');
->middleware(['MiddlewareClass' => ['action1', 'action2'] ]);
->middleware(['MiddlewareClass1' => ['action1', 'action2'], 'MiddlewareClass2' => ['action1'] ]);

中间件类

需要创建一个包含一个或多个方法的类。每个方法应包含相应的逻辑并返回一个响应。

Class Middleware
{
  public function action()
  {
    //Validando...

    //Se nenhum valor for retornado, a aplicação receberá um valor nulo como resposta e seguirar seu fluxo. É facultativo o uso de "return null".

    //Caso algum valor seja retornado além de nulo, o fluxo da aplicação será encerrado e o retorno será exbido como resposta ao usuário.
  }
}

路由组的方法

路由分组

分组路由可以减少在文件中重复命令,因为可以通过调用“group”方法在路由组中执行相同的函数。

Group方法

要开始一个路由组,只需调用“group”函数。

$route->group()

注意:方法声明后,必须按顺序调用“add”函数,然后可以使用其他方法。

将路由添加到组

要向组中添加一个或多个路由,只需调用“add”方法并传递一个包含路由的数组作为参数。您可以在组内部正常使用路由的所有方法,唯一的例外是当前无法在组内部调用组。

->add([
  $route->set('get', 'foo')->controller('ControllerClass', 'action')->name('foo-route'),
  $route->set('post', 'bar')->controller('ControllerClass', 'action')->name('bar-route')
]);

注意:此函数返回一个包含所有路由组方法的“HttpRoutes\Route\GroupRoutesMethods”实例。

指定所有路由的基础路径

您可以为组中的所有路由指定一个前缀路径,为此请调用“path”方法。

->path('foo/bar/');
控制器

一个路由组可以属于同一个类。控制器的方法应以数组形式按路由在组内的顺序告知。

->controller("ControllerClass", ['action1', 'action2']);
中间件

此函数的使用方式与单个路由的使用方式相同。中间件始终按定义顺序执行,首先是每个路由的单独中间件,最后是组的中间件。

->middleware(['Examples\Bar' => ['action'], 'Examples\Foo' => ['action']]);