buffalokiwi / telephonist
将请求路由到某个地方进行事物处理
v1.0.2
2022-05-18 01:06 UTC
Requires
- php: ~8.0
Requires (Dev)
- phpunit/phpunit: ^9.3
- vimeo/psalm: ^4.15
This package is auto-updated.
Last update: 2024-09-18 06:14:24 UTC
README
Telephonist是一个简单的PHP路由库,它是一个程序,用于根据各种匹配标准将HTTP请求映射到处理器。
目录
- [箱子里有什么?](#interfaces-and-implementations)
- 基本路由
接口和实现
接口
- 处理器
- IArgumentResolver - 使用PHP反射API,确定调用某些方法时使用的参数的类型、数量和值
- IRouteHandler - 路由处理器负责定位某些端点并返回内容。这可以是任何东西,比如文件、类、某些全局函数、RPC等。
- 路由对象
- IHTTPRoute - 表示潜在目的地和连接要求的对象。
- IHTTPRouteFactory - 可选的工厂,用于向IHTTPRouter的实现提供IHTTPRoute实例。
- 路由选项
- IHTTPRouteOption - 用于扩展路由匹配所需的条件。这可以是任何东西,比如HTTP方法、接受头、身份验证令牌等。
- IHTTPRouteOptions - IHTTPRouteOption的集合
- 路由请求
- IHTTPRouteRequest - 表示HTTP请求消息,并向路由器公开相关部分
- 路由器
- IHTTPRouter - 负责根据某些客户端请求确定调用哪个路由的程序
实现
-
处理器 ArgumentResolver ClassRouteHandler FunctionRouteHandler
-
路由对象 ArrayRouteFactory HTTPRoute ClassHTTPRoute DefaultHTTPRoute DefaultHTTPRouteFactory NestedArrayRouteFactory HTTPRouteFactoryGroup
-
路由选项 DefaultHTTPRouteOptions HTTPRouteOption MethodRouteOption XMLHTTPRequestRouteOption
-
路由请求 DefaultHTTPRouteRequest
-
路由器 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'; }