其实严格意义来说`Go`中没有类、继承的等概念,为了结合`Laravel`框架的编程思想更好的理解,所以做了个控制器基础类`base_api_controller.go` ,当然你也无需继承任何的基础类或其他控制器。
## 控制器定义
一个典型的控制器类定义如下:
```
// Package v1 处理业务逻辑, GoHub 控制器 v1
package v1
import (
"gohub/pkg/response"
"github.com/gin-gonic/gin"
)
type BaseAPIController struct {
}
func (lc *BaseAPIController) Index(c *gin.Context) {
c.JSON(200, "Hello World")
}
```
控制器类文件实际上可以是任意位置只需要路由文件中找到“它”即可,但我们为了遵守框架的编码规范和目录结构,**强烈建议**在`app/http/controllers/api`目录下定义它,当然几章前提到的接口区分`v1` `v2` `...`版本,所以文件的标准位置是
```
app/http/controllers/api/v1
```
控制器类无需继承任何包(类)文件,但我们还是建议你继承一个基础包(类)文件`base_api_controller.go`以便不时之需。
## 控制器方法作用域
与其他语言不同,在`Go`中不能使用`public` `protected` `private` 关键字声明方法的作用域,简单的来说只有两种情况:
只能在当前包文件访问的使用**开头字母小写**,比如说:
```
func (lc *BaseAPIController) show(c *gin.Context) {
c.JSON(200, "Hello World")
}
```
在所有包文件中都能使用的(全局)使用**开头字母大写**,比如说:
```
func (lc *BaseAPIController) Show(c *gin.Context) {
c.JSON(200, "Hello World")
}
```
更多更加详细的示例请查阅`Go语言基础`
## 渲染输出
默认情况下,控制器输出可以直接使用`gin`框架自带的输出方式,而不是`return` 。
为了更加方便和规范请使用框架公共响应包(类)文件`"gohub/pkg/response"` 你需要在控制器的顶部 `import` 这个文件才可以使用。
#### 响应成功
`response.ShowSuccess`方法可接收三个参数:
- 第一个参数为固定的`gin.Context`指针
- 第二个参数为响应的数据,可以是任何数据格式(`Go`版本必须`>= 1.18`)
- 第三个参数非必填,响应自定义的`msg`信息,默认为`success`
示例一:
```
response.ShowSuccess(c, "操作成功!")
```
输出结果:
```
{
"code":0,
"msg":"success",
"data":"操作成功!"
}
```
示例二:
```
response.ShowSuccess(c, gin.H{
"list": data,
"pagination": pagination,
},"操作成功!")
```
输出结果:
```
{
"code":0,
"msg":"操作成功!",
"data":{
"list":...,
"pagination":...
}
}
```
#### 响应失败
`response.ShowError`方法可接收三个参数:
- 第一个参数为固定的`gin.Context`指针
- 第二个参数是`Int`类型的错误码(请尽可能使用标准的`http状态码`,如 `401无权限访问`)
- 第三个参数非必填,响应自定义的`msg`信息,默认为`error`
示例:
```
response.ShowError(c, 404, "路由未定义,请确认 url 和请求方法是否正确。")
```
输出结果:
```
{
"code":401,
"msg":"路由未定义,请确认 url 和请求方法是否正确。",
"data":null
}
```
**所有响应的`HTTP`状态码均为200的`JSON`格式数据**,方便业务进行重试,同时也不会造成无关紧要的错误上报。
业务方只需判断`code`不为`0`就抛出`msg`的异常信息即可。
更加令人惊喜的是,无论在任意地方使用这个方法都会输出结果,并不在继续往下执行代码。这可以让我们不必在某些业务下频繁抛出无关紧要的异常特意的终止执行。
- 序言
- 基础
- 安装GoHub
- 目录结构
- 开发规范
- 部署项目
- 架构
- 架构总览
- 生命周期
- 配置
- 配置介绍
- 配置目录
- 配置格式
- 配置加载
- 读取配置
- 动态配置
- 环境变量配置
- 路由
- 路由模式
- 路由定义
- 路由参数
- 路由分组
- 路由限流
- 路由拆分
- 控制器
- 控制定义
- 控制器初始化
- 中间件
- Make创建控制器
- 请求
- 请求信息
- 数据库
- 连接数据库
- 基本使用
- Make创建模型
- 日志
- 介绍
- 日志驱动
- 日志写入
- HTTP日志
- 数据库请求日志
- 错误和调试
- Debuger调试器
- 验证
- 验证器
- 验证规则
- Make创建验证器
- 杂项
- 缓存
- 分页
- 验证码
- CURL请求
- 命令行
- 基础知识
- console 包
- Cobra 基础
- 命令行模式
- 附录
- 配置参考
- 第三方依赖库