多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 注册路由 最基础的路由定义方法是 在控制器中指定 @RestController 注解: >[danger] 要使用`Route`类注册路由必须首先在路由定义文件开头添加引用 **(后面不再重复说明)** > ~~~ > use ESD\Plugins\EasyRoute\Annotation\RestController; > ~~~ ~~~ <?php namespace ESD\Examples\Controller; use ESD\Go\GoController; use ESD\Plugins\EasyRoute\Annotation\RestController; /** * @RestController("user") */ class CUser extends GoController{ } ~~~ >[info] 由于路由需要框架启动前就进行解析,所以框架需要扫描标记了@RestController 的类进行注册路由规则。如果你忘记在控制器上使用用该注解,以下相关路由规则均无效。 例如注册如下路由规则: ~~~ /** * 声明控制器里需要解析路由规则 * @RestController() */ class Index extends GoController { /** * 设置一个主页路由 * @GetMapping("/") * @return string */ public function test() { return "hello"; } } ~~~ 我们访问: ~~~ http://serverName:8080/ ~~~ 会自动路由到: ~~~ Index 类的 test 方法 ~~~ 我们看到方法的注释中有 `@GetMapping`方法,表示这是指定请求类型为GET的,如果请求的非GET类型,则系统会抛出http 400 bad request。 请求类型的快捷方法,还包括: | 类型 | 描述 | 快捷方法 | | --- | --- | --- | | GET | GET请求 | @GetMapping| | POST | POST请求 | @PostMapping| | 其他请求| 通过参数method={"put","delete"}} | @RequestMapping| 如: ~~~ ** * @RequestMapping(method={"put","delete"}) * @return string */ public function test5(){ return "hello"; } ~~~ # 路由表达式 路由表达式统一使字符串定义,采用规则定义的方式(不支持直接使用正则表达式,但支持给某个变量定义正则,参考后面的变量规则部分)。 ## 规则表达式 规则表达式通常包含静态规则和动态规则,以及两种规则的结合,例如下面都属于有效的规则表达式: 默认情况下,`*Mapping`使用一种语法,其中`{foo}`指定一个名为`foo`的占位符并匹配正则表达式\[^ /\] +`。要调整占位符匹配的模式,可以通过编写`{bar:\[0-9\] +}`来指定自定义模式。一些例子: ~~~ // 匹配 /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。**可选部件仅支持在尾随位置**,而不是在路径中间。 ~~~ //比如这条规则 @GetMapping("/user/{id:\d+}[/{name}]") // 相当于下面两条规则 @GetMapping("/user/{id:\d+}") @GetMapping("/user/{id:\d+}/{name}") // 也可以使用多个嵌套的可选部件 @GetMapping("/user[/{id:\d+}[/{name}]]") // 此路由无效,因为可选部件只能在最后发生 @GetMapping("/user[/{id:\d+}]/{name}") ~~~