🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 路由定义 此页面参照了EasySwoole Distributed的文档,原文档地址 [https://www.kancloud.cn/tmtbe/goswoole/1086144](https://www.kancloud.cn/tmtbe/goswoole/1086144) ## 注册路由 最基础的路由定义方法是 在控制器中指定 @RestController 注解: > 要使用`Route`类注册路由必须首先在路由定义文件开头添加引用 **(后面不再重复说明)** > > ```php > use ESD\Plugins\EasyRoute\Annotation\RestController; > ``` ```php <?php namespace ESD\Examples\Controller; use ESD\Go\GoController; use ESD\Plugins\EasyRoute\Annotation\RestController; /** * @RestController("user") */ class UserController extends GoController{ } ``` > 由于路由需要框架启动前就进行解析,所以框架需要扫描标记了@RestController 的类进行注册路由规则。如果你忘记在控制器上使用用该注解,以下相关路由规则均无效。 例如注册如下路由规则: ```php /** * 声明控制器里需要解析路由规则 * @RestController() */ class IndexController extends GoController { /** * 设置一个主页路由 * @GetMapping("/") * @return string */ public function actionTest() { return "hello"; } } ``` > action仅仅是个前缀,为了和Yii2的写法保持一致,可以省略。 我们访问: ```http http://serverName:8080/ ``` 会自动路由到: > Index 类的 actionTest方法 我们看到方法的注释中有 `@GetMapping`方法,表示这是指定请求类型为GET的,如果请求的非GET类型,则系统会抛出 http 400 bad request。 请求类型的快捷方法,还包括: | 类型 | 描述 | 快捷方法 | | :------- | :------------------------------- | :-------------- | | GET | GET请求 | @GetMapping | | POST | POST请求 | @PostMapping | | 其他请求 | 通过参数method={"put","delete"}} | @RequestMapping | 如: ```php ** * @RequestMapping(method={"put","delete"}) * @return string */ public function test5(){ return "hello"; } ``` # 路由表达式 路由表达式统一使字符串定义,采用规则定义的方式(不支持直接使用正则表达式,但支持给某个变量定义正则,参考后面的变量规则部分)。 ## 规则表达式 规则表达式通常包含静态规则和动态规则,以及两种规则的结合,例如下面都属于有效的规则表达式: 默认情况下,`*Mapping`使用一种语法,其中`{foo}`指定一个名为`foo`的占位符并匹配正则表达式 `[^ /] +` , 要调整占位符匹配的模式,可以通过编写 `{bar:[0-9] +}` 来指定自定义模式。一些例子: ```php // 匹配 /user/42, 不匹配 /user/xyz @GetMapping("/user/{id:\d+}") // 匹配 /user/foobar, 不匹配 /user/foo/bar @GetMapping("/user/{name}") // 匹配 /user/foo/bar as well @GetMapping("/user/{name:.+}") ``` ## 可选变量 路径占位符的自定义模式无法使用捕获组。例如,`{lang:(en|de)}`不是有效的占位符,因为`()`是一个捕获组。相反,你可以使用`{lang:en|de}`或`{lang:(?:en|de)}`。 此外,`[...]`中包含的路径部分被认为是可选的,因此/ foo [bar]将匹配/ foo和/ foobar。**可选部件仅支持在尾随位置**,而不是在路径中间。 ```php //比如这条规则 @GetMapping("/user/{id:\d+}[/{name}]") // 相当于下面两条规则 @GetMapping("/user/{id:\d+}") @GetMapping("/user/{id:\d+}/{name}") // 也可以使用多个嵌套的可选部件 @GetMapping("/user[/{id:\d+}[/{name}]]") // 此路由无效,因为可选部件只能在最后发生 @GetMapping("/user[/{id:\d+}]/{name}") ```