# 路由定义
此页面参照了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}")
```
- 1 介绍
- 2 安装
- 2.1 环境
- 2.2 安装
- 3 配置
- 3.1 Server配置
- 3.2 端口配置
- 3.3 项目结构
- 3.4 内核优化
- 4 服务
- 4.1 HTTP服务
- 4.1.1 路由
- 4.1.1.1 静态路由
- 4.1.1.2 路由定义
- 4.1.1.3 路由方法
- 4.1.1.4 路由分组
- 4.1.1.5 资源路由
- 4.1.1.6 端口作用域
- 4.1.1.7 异常处理
- 4.1.1.8 跨域请求
- 4.1.1.9 路由缓存
- 4.1.2 控制器
- 4.1.2.1 控制器初始化
- 4.1.2.2 前置后置操作
- 4.1.2.3 跳转与重定向
- 4.1.2.4 异常处理
- 4.1.3 请求
- 4.1.3.1 请求对象
- 4.1.3.2 请求信息
- 4.1.3.3 REQUEST消息
- 4.1.3.4 RESPONSE消息
- 4.1.3.5 STREAM消息
- 4.1.3.6 URI信息
- 4.1.3.7 处理上传文件
- 4.1.3.8 验证器
- 4.2 Websocket服务
- 4.2.1 Websocket配置
- 4.2.2 Websocket路由
- 4.3 TCP服务
- 4.3.1 TCP配置
- 4.3.2 TCP路由
- 4.3.3 协程处理案例
- 5 插件
- 5.15 Yii-PDO插件
- 5.15.1 PDO 连接MySQL Mariadb
- 5.15.2 PDO连接PostgreSQL
- 5.15.3 PDO连接GreenPlum
- 5.15.4 PDO连接Oracle
- 5.15.5 PDO连接Cubrid
- 5.15.6 PDO连接SQL Server
- 6 概念
- 7. Yii- I18N国际化
- 8. 模型 Yii-Model
- 8.1 快速创建模型
- 8.2 快速创建多个模型
- 8.3 核心验证器 Core Validators
- 9. 配合数据库工作
- 9.1.数据库访问对象 Database Access Objects
- 9.2 查询构造器 Query Builder
- 9.3 活动记录 Active Record