ft / just-routes
一个专门用于路由请求的库。简单。轻量。快速
1.3.1
2023-02-14 03:12 UTC
Requires
- ft/attributes: ^2.2
- ft/request-response: ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
一个非常轻量、快速且专注的PHP库,专门用于路由请求。无需烦恼,无需框架。
仅属性、纯PHP和仅路由
用法
创建控制器
final class MyController { }
- 使用请求映射注解你的控制器
#[RequestMapping(value: "/foobar")] final class MyController { }
- 将路由作为方法添加到控制器
#[RequestMapping(value: "/foobar")] final class MyController { #[GetMapping] function voidMethod() { // maps to GET /foobar } #[GetMapping(value: "/bazz")] function get_bazz() { // maps to GET /foobar/bazz echo "bazz"; } }
注册控制器
RouteFactory::registerController(MyController::class);
自定义
你可以自定义一些控制流程模式
- 异常
- 未找到路径
异常
你可以在控制器层或通过RouteFactory全局捕获异常
通过控制器注解进行作用域异常处理
#[RequestMapping(value: "/foobar")] final class MyController { #[GetMapping] function voidMethod() { // maps to GET /foobar throw new IllegalArgumentException("Illegal"); } #[GetMapping(value: "/bazz")] function get_bazz() { // maps to GET /foobar/bazz throw new IllegalArgumentException("Illegal"); } #[ExceptionHandler(IllegalArgumentException::class)] function handle_illegal_arg_exc(IllegalArgumentException $exc, string $path) { //swallowed IllegalArgumentException only from this controller's routes } }
全局捕获异常
RouteFactory::registerController(MyController::class); RouteFactory::onException(IllegalArgumentException::class, function (string $path) { echo "Caught globally"; });
未找到
全局处理
RouteFactory::registerController(MyController::class); RouteFactory::onNotFound(function ($path) { echo "$path not found"; });
结束
这就是配置路由的全部。现在只需简单分发请求
RouteFactory::registerController(MyController::class); RouteFactory::dispatch();
杂项
语义属性
- #[GetMapping]
- #[PutMapping]
- #[PostMapping]
- #[DeleteMapping]
其他属性
-
#[RequestMapping]
-
#[ExceptionHandler]
-
#[RequestParam] - 直接将请求参数注入为方法参数
#[RequestMapping(value: "/foobar")] final class MyController { #[GetMapping("/id/{id}")] public function get_foo(int $id, #[RequestParam] string $internal, #[RequestParam] array $foos) { // Example req: // GET /foobar/id/1?internal=true&foos[]=1&foos[]=2&foos[]=3 } }
-
#[RequestHeader] - 直接将头注入为方法参数
#[RequestMapping(value: "/foobar")] final class MyController { #[GetMapping("/id/{id}")] public function get_foo(int $id, #[RequestHeader] string $referer) { } }
路由语法
路由由/
分隔,必须以/
开头,且对于HTTP方法类型不能重复
路由可以包含路径变量。路径变量由{}
花括号封装。
具有路径变量的路由必须在路由方法签名中具有参数
例如
#[RequestMapping(value: "/foobar")] final class MyController { #[GetMapping(value: "/name/{name}/age/{age}")] function get_for_name_age(string $name, int $age) { // example req // GET /foobar/name/John/age/18 } }