路由

    hyperf-skeleton 骨架下,默认在 config/routes.php 文件内完成所有的路由定义,当然如果您路由众多,您也可以对该文件进行扩展,以适应您的需求,但 Hyperf 还支持 注解路由,我们更推荐使用 注解路由,特别是在路由众多的情况下。

    通过闭包定义路由

    构建一个最基本的路由只需一个 URI 和一个 闭包(Closure),我们直接通过代码来演示一下:

    您可以通过 浏览器 或 cURL 命令行来请求 http://host:port/hello-hyperf 来访问该路由。

    定义标准路由

    所谓标准路由指的是由 控制器(Controller)操作(Action) 来处理的路由,如果您使用 请求处理器(Request Handler) 模式也是类似的,我们通过代码来演示一下:

    1. <?php
    2. use Hyperf\HttpServer\Router\Router;
    3. Router::get('/hello-hyperf', 'App\Controller\IndexController::hello');
    4. Router::get('/hello-hyperf', 'App\Controller\IndexController@hello');
    5. Router::get('/hello-hyperf', [App\Controller\IndexController::class, 'hello']);

    该路由定义为将 /hello-hyperf 路径绑定到 App\Controller\IndexController 下的 hello 方法。

    可用的路由方法

    有时候您可能需要注册一个可以同时响应多种 HTTP METHOD 请求的路由,可以通过 addRoute 方法实现定义:

    1. use Hyperf\HttpServer\Router\Router;
    2. Router::addRoute(['get', 'post'], $uri, $callback);

    Hyperf 提供了非常便利的 路由功能,您可以直接在任意类上通过定义 @Controller@AutoController 注解来完成一个路由的定义。

    @AutoController 注解

    @AutoController 为绝大多数简单的访问场景提供路由绑定支持,使用 @AutoController 时则 Hyperf 会自动解析所在类的所有 public 方法并提供 GETPOST 两种请求方式。

    @Controller 注解

    @Controller 为满足更细致的路由定义需求而存在,使用 @Controller 注解用于表名当前类为一个 类,同时需配合 @RequestMapping 注解来对请求方法和请求路径进行更详细的定义。我们也提供了多种快速便捷的 Mapping 注解,如 @GetMapping@PostMapping@PutMapping@PatchMapping@DeleteMapping 5种便捷的注解用于表明允许不同的请求方法。

    1. <?php
    2. declare(strict_types=1);
    3. namespace App\Controller;
    4. use Hyperf\HttpServer\Contract\RequestInterface;
    5. use Hyperf\HttpServer\Annotation\Controller;
    6. use Hyperf\HttpServer\Annotation\RequestMapping;
    7. * @Controller()
    8. */
    9. class UserController
    10. {
    11. // Hyperf 会自动为此方法生成一个 /user/index 的路由,允许通过 GET 或 POST 方式请求
    12. /**
    13. * @RequestMapping(path="index", method="get,post")
    14. public function index(RequestInterface $request)
    15. {
    16. // 从请求中获得 id 参数
    17. $id = $request->input('id', 1);
    18. return (string)$id;
    19. }
    20. }

    注解参数

    @Controller@AutoController 都提供了 prefixserver 两个参数。

    prefix 表示该 Controller 下的所有方法路由的前缀,默认为类名的小写,如 UserControllerprefix 默认为 user,如类内某一方法的 pathindex,则最终路由为 /user/index。需要注意的是 prefix 并非一直有效,当类内的方法的 path/ 开头时,则表明路径从 URI 头部开始定义,也就意味着会忽略 prefix 的值。

    server 表示该路由是定义在哪个 Server 之上的,由于 Hyperf 支持同时启动多个 Server,也就意味着有可能会同时存在多个 HTTP Server,则在定义路由是可以通过 server 参数来进行区分这个路由是为了哪个 Server 定义的,默认为 http

    必填参数

    我们可以对 $uri 进行一些参数定义,通过 {} 来声明参数,如 /user/{id} 则声明了 id 值为一个必填参数。

    可选参数

    有时候您可能会希望这个参数是可选的,您可以通过 [] 来声明中括号内的参数为一个可选参数,如 /user/[{id}]