ft/just-routes

一个专门用于路由请求的库。简单。轻量。快速

1.3.1 2023-02-14 03:12 UTC

This package is auto-updated.

Last update: 2024-09-14 06:37:19 UTC


README

一个非常轻量、快速且专注的PHP库,专门用于路由请求。无需烦恼,无需框架。

仅属性、纯PHP和仅路由

用法

  1. composer require ft/just-routes
  2. 创建控制器
  3. 注册控制器
  4. 添加可选方法
  5. 分发请求

创建控制器

final class MyController {

}
  1. 使用请求映射注解你的控制器
#[RequestMapping(value: "/foobar")]
final class MyController {

}
  1. 将路由作为方法添加到控制器
#[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);

自定义

你可以自定义一些控制流程模式

  1. 异常
  2. 未找到路径

异常

你可以在控制器层或通过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
    }

}