# 路由 默认情况下路由由 [nikic/fast-route](https://github.com/nikic/FastRoute) 提供支持,并由 [hyperf/http-server](https://github.com/hyperf-cloud/http-server) 组件负责接入到 `Hyperf` 中,`RPC` 路由由对应的 [hyperf/rpc-server](https://github.com/hyperf-cloud/rpc-server) 组件负责。 ## HTTP 路由 ### 通过配置文件定义路由 在 [hyperf-skeleton](https://github.com/hyperf-cloud/hyperf-skeleton) 骨架下,默认在 `config/routes.php` 文件内完成所有的路由定义,当然如果您路由众多,您也可以对该文件进行扩展,以适应您的需求,但 `Hyperf` 还支持 `注解路由`,我们更推荐使用 `注解路由`,特别是在路由众多的情况下。 #### 通过闭包定义路由 构建一个最基本的路由只需一个 URI 和一个 `闭包(Closure)`,我们直接通过代码来演示一下: ```php 使用 `@AutoController` 注解时需 `use Hyperf\HttpServer\Annotation\AutoController;` 命名空间; ```php input('id', 1); return (string)$id; } } ``` #### `@Controller` 注解 `@Controller` 为满足更细致的路由定义需求而存在,使用 `@Controller` 注解用于表明当前类为一个 `Controller` 类,同时需配合 `@RequestMapping` 注解来对请求方法和请求路径进行更详细的定义。 我们也提供了多种快速便捷的 `Mapping` 注解,如 `@GetMapping`、`@PostMapping`、`@PutMapping`、`@PatchMapping`、`@DeleteMapping` 5种便捷的注解用于表明允许不同的请求方法。 > 使用 `@Controller` 注解时需 `use Hyperf\HttpServer\Annotation\Controller;` 命名空间; > 使用 `@RequestMapping` 注解时需 `use Hyperf\HttpServer\Annotation\RequestMapping;` 命名空间; > 使用 `@GetMapping` 注解时需 `use Hyperf\HttpServer\Annotation\GetMapping;` 命名空间; > 使用 `@PostMapping` 注解时需 `use Hyperf\HttpServer\Annotation\PostMapping;` 命名空间; > 使用 `@PutMapping` 注解时需 `use Hyperf\HttpServer\Annotation\PutMapping;` 命名空间; > 使用 `@PatchMapping` 注解时需 `use Hyperf\HttpServer\Annotation\PatchMapping;` 命名空间; > 使用 `@DeleteMapping` 注解时需 `use Hyperf\HttpServer\Annotation\DeleteMapping;` 命名空间; ```php input('id', 1); return (string)$id; } } ``` #### 注解参数 `@Controller` 和 `@AutoController` 都提供了 `prefix` 和 `server` 两个参数。 `prefix` 表示该 `Controller` 下的所有方法路由的前缀,默认为类名的小写,如 `UserController` 则 `prefix` 默认为 `user`,如类内某一方法的 `path` 为 `index`,则最终路由为 `/user/index`。 需要注意的是 `prefix` 并非一直有效,当类内的方法的 `path` 以 `/` 开头时,则表明路径从 `URI` 头部开始定义,也就意味着会忽略 `prefix` 的值。 `server` 表示该路由是定义在哪个 `Server` 之上的,由于 `Hyperf` 支持同时启动多个 `Server`,也就意味着有可能会同时存在多个 `HTTP Server`,则在定义路由是可以通过 `server` 参数来进行区分这个路由是为了哪个 `Server` 定义的,默认为 `http`。 ### 路由参数 > 本框架定义的路由参数必须和控制器参数键名、类型保持一致,否则控制器无法接受到相关参数 ```php Router::get('/user/{id}', 'App\Controller\UserController::info') ``` ```php public function index(int $id) { $user = User::find($id); return $user->toArray(); } ``` #### 必填参数 我们可以对 `$uri` 进行一些参数定义,通过 `{}` 来声明参数,如 `/user/{id}` 则声明了 `id` 值为一个必填参数。 #### 可选参数 有时候您可能会希望这个参数是可选的,您可以通过 `[]` 来声明中括号内的参数为一个可选参数,如 `/user/[{id}]`。