进阶 www.iris-go.com 2026-10-20 02:39:14 · 13 阅读

第18章 Iris MVC 框架快速入门指南

快速入门 以下指南仅展示了部分 Iris MVC 特性的简单用法示例。在实际应用中,你完全可以自由定义数据结构与代码流程。 创建一个文件夹,假设其路径为 app。其目录结构应如下所示: ```text ├── main.go ├── go.mod ├── go.sum ├── environment │ └── environment.go ├── model │ ├── request.go │ └── response.go ├── database │ ├── database.go │ ├── mysql.go │ └── sqlite.go ├── service │ └── greet_service.go └── controller └── greet_controller.go ``` 进入该 app 文件夹并执行以下命令: ```bash $ go mod init app $ go get -u github.com/kataras/iris/v12@main # 或 @latest,以获取最新稳定版本。 ``` 环境配置 首先,定义 Web 应用程序可运行的环境。 本例仅关注两种最常见场景所对应的环境——“开发”(development)和“生产”(production)。ReadEnv 函数将读取系统环境变量的 Env 类型值(详见本页末尾的 main.go 文件)。 创建 environment/environment.go 文件,并写入以下内容: ```go package environment import ( "os" "strings" ) const ( PROD Env = "production" DEV Env = "development" ) type Env string func (e Env) String() string { return string(e) } func ReadEnv(key string, def Env) Env { v := Getenv(key, def.String()) if v == "" { return def } env := Env(strings.ToLower(v)) switch env { case PROD, DEV: // 允许的合法环境 default: panic("unexpected environment " + v) } return env } func Getenv(key string, def string) string { if v := os.Getenv(key); v != "" { return v } return def } 数据库\n\n我们会用到两个数据库管理系统:MySQL 和 SQLite。前者用于“生产”环境,后者用于“开发”环境。新建 database/database.go 文件,粘贴以下内容:\n\ngo\npackage database\n\nimport \"app/environment\"\n\ntype DB interface {\n Exec(q string) error\n}\n\nfunc NewDB(env environment.Env) DB {\n switch env {\n case environment.PROD:\n return &mysql{}\n case environment.DEV:\n return &sqlite{}\n default:\n panic(\"unknown environment\")\n }\n}\n1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18\n\n接下来模拟 MySQL 和 SQLite 的数据库实例。新建 database/mysql.go 文件,内容如下:\n\ngo\npackage database\n\nimport \"fmt\"\n\ntype mysql struct{}\n\nfunc (db *mysql) Exec(q string) error {\n return fmt.Errorf(\"mysql: not implemented <%s>\", q)\n}\n1
2
3
4
5
6
7
8
9\n\n再新建一个 database/sqlite.go 文件:\n\ngo\npackage database\n\ntype sqlite struct{}\n\nfunc (db *sqlite) Exec(q string) error { return nil }\n1
2
3
4
5 数据库依赖环境。一个包含 Docker 镜像的实用且可运行的数据库示例可以在以下指南中找到:https://github.com/kataras/iris/tree/main/_examples/database/mysqlService 我们需要一个服务来代表我们的 Controller 与数据库实例通信。在我们的场景中,只需要一个单一的服务:问候服务(Greet Service)。为了示例的目的,我们将基于环境使用两种问候服务的实现。GreetService 接口包含一个方法 Say(input string) (output string, err error)。创建一个 ./service/greet_service.go 文件并编写以下代码: gopackage service import ( "fmt" "app/database" "app/environment" ) // GreetService example service. type GreetService interface { Say(input string) (string, error) } // NewGreetService returns a service backed with a "db" based on "env". func NewGreetService(env environment.Env, db database.DB) GreetService { service := &greeter{db: db, prefix: "Hello"} switch env { case environment.PROD: return service case environment.DEV: return &greeterWithLogging{service} default: panic("unknown environment") } } type greeter struct { prefix string db database.DB } func (s *greeter) Say(input string) (string, error) { if err := s.db.Exec("simulate a query..."); err != nil { return "", err } result := s.prefix + " " + input return result, nil } type greeterWithLogging struct { *greeter } func (s *greeterWithLogging) Say(input string) (string, error) { result, err := s.greeter.Say(input) fmt.Printf("result: %s\nerror: %v\n", result, err) return result, err }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
在生产环境中将使用 greeter,而在开发环境中将使用 greeterWithLogging。GreetService 依赖于环境和 DB。模型 继续创建我们的 HTTP 请求和响应模型。创建一个 model/request.go 文件并复制粘贴以下代码: gopackage model type Request struct { Name string `url:"name"` }
1
2
3
4
5
`model/response.go` 文件的写法也类似: ```go package model type Response struct { Message string `json:"msg"` } ``` 1
2
3
4
5
该服务器会接受一个名为 `name` 的 URL 查询参数(例如 `/greet?name=kataras`),并返回一条 JSON 消息。 ### 控制器 MVC 中的控制器负责管理应用程序的执行流程。当向 MVC 应用发起请求(即请求某个页面)时,由控制器负责返回响应。 对于我们的迷你 Web 应用,只需要一个 `GreetController`。在 `controller/greet_controller.go` 文件中创建如下内容: ```go package controller import ( "app/model" "app/service" ) type GreetController struct { Service service.GreetService // Ctx iris.Context } func (c *GreetController) Get(req model.Request) (model.Response, error) { message, err := c.Service.Say(req.Name) if err != nil { return model.Response{}, err } return model.Response{Message: message}, nil } ``` 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GreetController 依赖 GreetService,通过 Get 方法处理 GET: /greet 的 index 路径。Get 方法接收一个 model.Request,其中只有一个 Name 字段,会从 URL 查询参数 'name' 中提取(因为这是 GET 请求,且结构体字段标记了 url:"name")。最后返回 model.Response(JSON)或错误。 Wrap up ​sh +-------------------+ | Env (DEV, PROD) | +---------+---------+ | | | | | | | | | DEV | | | PROD -------------------+---------------------+ | +----------------------+------------------- | | | | | | +---+-----+ +----------------v------------------+ +----+----+ | sqlite | | NewDB(Env) DB | | mysql | +---+-----+ +----------------+---+--------------+ +----+----+ | | | | | | | | | | | | +--------------+-----+ +-------------------v---v-----------------+ +----+------+ | greeterWithLogging | | NewGreetService(Env, DB) GreetService | | greeter | +--------------+-----+ +---------------------------+-------------+ +----+------+ | | | | | | | +-----------------------------------------+ | | | GreetController | | | | | | | | | | - Service GreetService <-- | | | | | | | +-------------------+---------------------+ | | | | | | | | | | | +-----------+-----------+ | | | HTTP Request | | | +-----------------------+ | | | /greet?name=kataras | | | +-----------+-----------+ | | | | +------------------+--------+ +------------+------------+ +-------+------------------+ | model.Response (JSON) | | Response (JSON, error) | | Bad Request | +---------------------------+ +-------------------------+ +--------------------------+ | { | | mysql: not implemented | | "msg": "Hello kataras" | +--------------------------+ | } | +---------------------------+1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
现在将这些内容整合到主文件 main.go 中。请复制并粘贴以下代码:gopackage main import ( "app/controller" "app/database" "app/environment" "app/service" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/mvc" ) func main() { app := iris.New() app.Get("/ping", pong).Describe("healthcheck") mvc.Configure(app.Party("/greet"), setup) // http://localhost:8080/greet?name=kataras app.Listen(":8080", iris.WithLogLevel("debug")) } func pong(ctx iris.Context) { ctx.WriteString("pong") } func setup(app *mvc.Application) { // Register Dependencies. app.Register( environment.DEV, // DEV, PROD database.NewDB, // sqlite, mysql service.NewGreetService, // greeterWithLogging, greeter ) // Register Controllers. app.Handle(new(controller.GreetController)) }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

mvc.Application.Register 方法用于注册依赖项,且这些依赖项也可以依赖于先前注册的依赖。这就是为什么注册顺序是先环境(DEV),再 NewDB(依赖于该环境),最后是 NewGreetService(依赖于环境和数据库)。

mvc.Application.Handle 方法负责注册新的控制器,该控制器依赖于 GreetService,并挂载到 Party("/greet") 指定的子路由上。

运行 安装 Go 并执行以下命令运行应用程序:bashgo run main.go1

或者 Docker 将 Dockerfile 和 docker-compose.yml 文件下载到 app 文件夹中。安装 Docker 并执行以下命令:bash$ docker-compose up1

访问 http://localhost:8080?name=kataras

可选操作:将 main.go 中的 app.Register(environment.DEV) 替换为 environment.PROD,重启应用并刷新页面。你会看到新的数据库(sqlite)和另一个服务(greeterWithLogging)被绑定到 GreetController 上。仅需一处修改,即可彻底改变运行结果。

评论 (0)