berlioz/router

Berlioz Router 是一个遵循 PSR-7(HTTP 消息接口)标准的 PHP 库,用于管理 HTTP 路由。

v2.1.0 2023-08-29 11:13 UTC

This package is auto-updated.

Last update: 2024-08-29 13:27:06 UTC


README

Latest Version Software license Build Status Quality Grade Total Downloads

Berlioz Router 是一个用于管理 HTTP 路由的 PHP 库,遵循 PSR-7(HTTP 消息接口)标准。

安装

Composer

您可以使用 Composer 安装 Berlioz Router,这是推荐的安装方式。

$ composer require berlioz/router

依赖项

  • PHP ^8.0
    • berlioz/http-message
    • psr/log

用法

路由

创建路由

您可以使用以下方式创建简单路由

use Berlioz\Router\Route;

$route = new Route('/path-of/my-route');
$route = new Route('/path-of/my-route/{attribute}/with-attribute');

构造函数参数包括

  • defaults:一个关联数组,用于在生成路由时设置属性默认值
  • requirements:一个关联数组,用于限制属性的格式。键是属性的名称,值是验证正则表达式
  • name:路由名称
  • method:允许的 HTTP 方法数组,或只是一个方法
  • host:允许的主机数组,或只是一个主机
  • priority:您可以为路由指定优先级(默认:-1)

路由分组

一个路由可以转换为分组,只需将另一个路由关联到它们即可。

use Berlioz\Router\Route;

$route = new Route('/path');
$route->addRoute($route2 = new Route('/path2')); // Path will be: /path/path2

子路由继承父路由的属性、要求等

属性

路由可以接受可选属性,您需要用括号将可选部分括起来。

$route = new \Berlioz\Router\Route('/path[/optional-part/{with-attribute}]');

您还可以直接在路径中定义要求

  • 在属性名称后添加正则表达式(用“:”分隔)。
  • 在属性名称后添加类型名称(用“::”分隔)。
$route = new \Berlioz\Router\Route('/path/{attributeName:\d+}');
$route = new \Berlioz\Router\Route('/path/{attributeName::int}');

支持的定义类型

  • int(相当于 \d+
  • float(相当于 \d+(\.\d+)
  • uuid4(相当于 [0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}
  • slug(相当于 [a-z0-9]+(?:-[a-z0-9]+)*
  • md5(相当于 [0-9a-fA-F]{32}
  • sha1(相当于 [0-9a-fA-F]{40}
  • domain(相当于 ([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}

路由器

路由器是包中的主要功能,它由 Router 类定义。它可以根据 ServerRequestInterface 对象(参见 PSR-7)找到合适的 Route 对象。

use Berlioz\Http\Message\ServerRequest;
use Berlioz\Router\Route;
use Berlioz\Router\Router;

// Create server request or get them from another place in your app
$serverRequest = new ServerRequest(...);

// Create router
$router = new Router();
$router->addRoute(
    new Route('/path-of/my-route'),
    new Route('/path-of/my-route/{attribute}/with-attribute')
);

$route = $router->handle($serverRequest);

生成路径

您可以直接使用 Router 对象生成带有一些参数的路径。

use Berlioz\Router\Exception\NotFoundException;
use Berlioz\Router\Router;

$router = new Router();
// ...add routes

try {
    $path = $router->generate('name-of-route', ['attribute1' => 'value']);
} catch (NotFoundException $exception) {
    // ... not found route
}

方法返回的是字符串格式的路径,或者在无法生成路径时抛出异常(例如,没有所有必需的参数)。

有效路径

您可以使用 ServerRequestInterface 验证,以确定路径是否可以被路由处理。

use Berlioz\Http\Message\ServerRequest;
use Berlioz\Router\Router;

$serverRequest = new ServerRequest(...);
$router = new Router();
// ...add routes

/** bool $valid Valid path ?*/
$valid = $router->isValid($serverRequest);

方法返回的是一个 boolean 值。