buffalokiwi/telephonist

将请求路由到某个地方进行事物处理

v1.0.2 2022-05-18 01:06 UTC

This package is auto-updated.

Last update: 2024-09-18 06:14:24 UTC


README

Telephonist是一个简单的PHP路由库,它是一个程序,用于根据各种匹配标准将HTTP请求映射到处理器。

目录

  1. [箱子里有什么?](#interfaces-and-implementations)
  2. 基本路由

接口和实现

接口

  1. 处理器
    1. IArgumentResolver - 使用PHP反射API,确定调用某些方法时使用的参数的类型、数量和值
    2. IRouteHandler - 路由处理器负责定位某些端点并返回内容。这可以是任何东西,比如文件、类、某些全局函数、RPC等。
  2. 路由对象
    1. IHTTPRoute - 表示潜在目的地和连接要求的对象。
    2. IHTTPRouteFactory - 可选的工厂,用于向IHTTPRouter的实现提供IHTTPRoute实例。
  3. 路由选项
    1. IHTTPRouteOption - 用于扩展路由匹配所需的条件。这可以是任何东西,比如HTTP方法、接受头、身份验证令牌等。
    2. IHTTPRouteOptions - IHTTPRouteOption的集合
  4. 路由请求
    1. IHTTPRouteRequest - 表示HTTP请求消息,并向路由器公开相关部分
  5. 路由器
    1. IHTTPRouter - 负责根据某些客户端请求确定调用哪个路由的程序

实现

  1. 处理器 ArgumentResolver ClassRouteHandler FunctionRouteHandler

  2. 路由对象 ArrayRouteFactory HTTPRoute ClassHTTPRoute DefaultHTTPRoute DefaultHTTPRouteFactory NestedArrayRouteFactory HTTPRouteFactoryGroup

  3. 路由选项 DefaultHTTPRouteOptions HTTPRouteOption MethodRouteOption XMLHTTPRequestRouteOption

  4. 路由请求 DefaultHTTPRouteRequest

  5. 路由器 BasicRouter DefaultHTTPRouter

最基本的路由器

try {
  echo ( new BasicRouter([
    '/' => fn() => 'This is the home page'
  ]))->route( new DefaultHTTPRouteRequest( $_SERVER ));
} catch( RouteNotFoundException $e ) {
  http_response_code( $e->getCode());  
}    

https:// 显示: "这是主页"

添加参数

可以通过使用标准的捕获组来添加参数

try {
  echo ( new BasicRouter([
    '(\d+)' => fn( int $id ) => 'Found digit ' . $id
  ]))->route( new DefaultHTTPRouteRequest( $_SERVER ));
} catch( RouteNotFoundException $e ) {
  http_response_code( $e->getCode());  
}    

https:///1 显示: "找到数字1"

我们可以通过使用命名的捕获组来使用命名参数,如下所示

如果使用命名参数,则必须为所有参数命名。不允许将位置参数与命名参数混合使用。

在以下示例中,将 $id 命名为除 $id 之外的其他内容将抛出异常。

try {
  echo ( new BasicRouter([
    '(?<id>\d+)' => fn( int $id ) => 'Found digit ' . $id,
  ]))->route( new DefaultHTTPRouteRequest( $_SERVER ));
} catch( RouteNotFoundException $e ) {
  http_response_code( $e->getCode());  
}
use buffalokiwi\telephonist\DefaultRouteConfig;
use buffalokiwi\telephonist\http\DefaultHTTPRouteOptions;
use buffalokiwi\telephonist\http\DefaultHTTPRouter;
use buffalokiwi\telephonist\http\DefaultHTTPRouteRequest;
use buffalokiwi\telephonist\http\ArrayRouteFactory;
use buffalokiwi\telephonist\http\DefaultRouteFactory;
use buffalokiwi\telephonist\http\MethodRouteOption;
use buffalokiwi\telephonist\http\XMLHTTPRequestRouteOption;
use buffalokiwi\telephonist\RouteNotFoundException;
use buffalokiwi\telephonist\http\HTTPRouteFactoryGroup;

class LocalRouterTest
{
  public const ROUTE_CONFIG = [
    'test' => [LocalRouterTest::class, 'helloRouter', ['GET'], []],
    'test/(\d+)' => [LocalRouterTest::class, 'helloRouterArg', ['GET'], []]
  ];

  public static function helloRouter() : string
  {
    return 'Hello Router!';
  }
  
  
  public static function helloRouterArg( int $i ) : string
  {
    return 'Hello Router ' . (string)$i . '!';
  }
}

$router = new DefaultHTTPRouter(
  new HTTPRouteFactoryGroup(
    new ArrayRouteFactory(
      new DefaultRouteConfig( fn() => LocalRouterTest::ROUTE_CONFIG )),
    (new DefaultRouteFactory())
    ->add( 'test2', function() {
      return 'Hello Router 2!';
    })
    ->add( 'test2/(\d+)', function( int $int, array $context ) {
      return 'Found ' . (string)$int;
    }, ['GET'], ['context' => 'foo'] )
  ),
  new DefaultHTTPRouteOptions(
    new MethodRouteOption(),
    new XMLHTTPRequestRouteOption()
));


try {
  echo $router->route( new DefaultHTTPRouteRequest( $_SERVER ));
} catch( RouteNotFoundException $e ) {
  http_response_code( $e->getCode());  
  echo 'Not found';
}