🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
其实严格意义来说`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`的异常信息即可。 更加令人惊喜的是,无论在任意地方使用这个方法都会输出结果,并不在继续往下执行代码。这可以让我们不必在某些业务下频繁抛出无关紧要的异常特意的终止执行。