From 34e13ed128dc2ac43e52aadf432a086385060f1f Mon Sep 17 00:00:00 2001 From: vCaesar Date: Sat, 10 Jun 2017 12:29:18 +0800 Subject: [PATCH] Format and remove 13.3.md spaces --- zh/13.3.md | 224 ++++++++++++++++++++++++++--------------------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/zh/13.3.md b/zh/13.3.md index 0ddb06c4..55ad4ae8 100644 --- a/zh/13.3.md +++ b/zh/13.3.md @@ -10,140 +10,140 @@ MVC设计模式是目前Web应用开发中最常见的架构模式,通过分 前面小节介绍了路由实现了注册struct的功能,而struct中实现了REST方式,因此我们需要设计一个用于逻辑处理controller的基类,这里主要设计了两个类型,一个struct、一个interface ```Go - type Controller struct { - Ct *Context - Tpl *template.Template - Data map[interface{}]interface{} - ChildName string - TplNames string - Layout []string - TplExt string - } +type Controller struct { + Ct *Context + Tpl *template.Template + Data map[interface{}]interface{} + ChildName string + TplNames string + Layout []string + TplExt string +} - type ControllerInterface interface { - Init(ct *Context, cn string) //初始化上下文和子类名称 - Prepare() //开始执行之前的一些处理 - Get() //method=GET的处理 - Post() //method=POST的处理 - Delete() //method=DELETE的处理 - Put() //method=PUT的处理 - Head() //method=HEAD的处理 - Patch() //method=PATCH的处理 - Options() //method=OPTIONS的处理 - Finish() //执行完成之后的处理 - Render() error //执行完method对应的方法之后渲染页面 - } +type ControllerInterface interface { + Init(ct *Context, cn string) //初始化上下文和子类名称 + Prepare() //开始执行之前的一些处理 + Get() //method=GET的处理 + Post() //method=POST的处理 + Delete() //method=DELETE的处理 + Put() //method=PUT的处理 + Head() //method=HEAD的处理 + Patch() //method=PATCH的处理 + Options() //method=OPTIONS的处理 + Finish() //执行完成之后的处理 + Render() error //执行完method对应的方法之后渲染页面 +} ``` 那么前面介绍的路由add函数的时候是定义了ControllerInterface类型,因此,只要我们实现这个接口就可以,所以我们的基类Controller实现如下的方法: ```Go - func (c *Controller) Init(ct *Context, cn string) { - c.Data = make(map[interface{}]interface{}) - c.Layout = make([]string, 0) - c.TplNames = "" - c.ChildName = cn - c.Ct = ct - c.TplExt = "tpl" - } +func (c *Controller) Init(ct *Context, cn string) { + c.Data = make(map[interface{}]interface{}) + c.Layout = make([]string, 0) + c.TplNames = "" + c.ChildName = cn + c.Ct = ct + c.TplExt = "tpl" +} - func (c *Controller) Prepare() { +func (c *Controller) Prepare() { - } +} - func (c *Controller) Finish() { +func (c *Controller) Finish() { - } +} - func (c *Controller) Get() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Get() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Post() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Post() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Delete() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Delete() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Put() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Put() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Head() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Head() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Patch() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Patch() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Options() { - http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) - } +func (c *Controller) Options() { + http.Error(c.Ct.ResponseWriter, "Method Not Allowed", 405) +} - func (c *Controller) Render() error { - if len(c.Layout) > 0 { - var filenames []string - for _, file := range c.Layout { - filenames = append(filenames, path.Join(ViewsPath, file)) - } - t, err := template.ParseFiles(filenames...) - if err != nil { - Trace("template ParseFiles err:", err) - } - err = t.ExecuteTemplate(c.Ct.ResponseWriter, c.TplNames, c.Data) - if err != nil { - Trace("template Execute err:", err) - } - } else { - if c.TplNames == "" { - c.TplNames = c.ChildName + "/" + c.Ct.Request.Method + "." + c.TplExt - } - t, err := template.ParseFiles(path.Join(ViewsPath, c.TplNames)) - if err != nil { - Trace("template ParseFiles err:", err) - } - err = t.Execute(c.Ct.ResponseWriter, c.Data) - if err != nil { - Trace("template Execute err:", err) - } +func (c *Controller) Render() error { + if len(c.Layout) > 0 { + var filenames []string + for _, file := range c.Layout { + filenames = append(filenames, path.Join(ViewsPath, file)) + } + t, err := template.ParseFiles(filenames...) + if err != nil { + Trace("template ParseFiles err:", err) + } + err = t.ExecuteTemplate(c.Ct.ResponseWriter, c.TplNames, c.Data) + if err != nil { + Trace("template Execute err:", err) + } + } else { + if c.TplNames == "" { + c.TplNames = c.ChildName + "/" + c.Ct.Request.Method + "." + c.TplExt + } + t, err := template.ParseFiles(path.Join(ViewsPath, c.TplNames)) + if err != nil { + Trace("template ParseFiles err:", err) + } + err = t.Execute(c.Ct.ResponseWriter, c.Data) + if err != nil { + Trace("template Execute err:", err) } - return nil } + return nil +} - func (c *Controller) Redirect(url string, code int) { - c.Ct.Redirect(code, url) - } +func (c *Controller) Redirect(url string, code int) { + c.Ct.Redirect(code, url) +} ``` 上面的controller基类已经实现了接口定义的函数,通过路由根据url执行相应的controller的原则,会依次执行如下: ```Go - Init() 初始化 - Prepare() 执行之前的初始化,每个继承的子类可以来实现该函数 - method() 根据不同的method执行不同的函数:GET、POST、PUT、HEAD等,子类来实现这些函数,如果没实现,那么默认都是403 - Render() 可选,根据全局变量AutoRender来判断是否执行 - Finish() 执行完之后执行的操作,每个继承的子类可以来实现该函数 +Init() 初始化 +Prepare() 执行之前的初始化,每个继承的子类可以来实现该函数 +method() 根据不同的method执行不同的函数:GET、POST、PUT、HEAD等,子类来实现这些函数,如果没实现,那么默认都是403 +Render() 可选,根据全局变量AutoRender来判断是否执行 +Finish() 执行完之后执行的操作,每个继承的子类可以来实现该函数 ``` ## 应用指南 上面beego框架中完成了controller基类的设计,那么我们在我们的应用中可以这样来设计我们的方法: ```Go - package controllers +package controllers - import ( - "github.com/astaxie/beego" - ) +import ( + "github.com/astaxie/beego" +) - type MainController struct { - beego.Controller - } +type MainController struct { + beego.Controller +} - func (this *MainController) Get() { - this.Data["Username"] = "astaxie" - this.Data["Email"] = "astaxie@gmail.com" - this.TplNames = "index.tpl" - } +func (this *MainController) Get() { + this.Data["Username"] = "astaxie" + this.Data["Email"] = "astaxie@gmail.com" + this.TplNames = "index.tpl" +} ``` 上面的方式我们实现了子类MainController,实现了Get方法,那么如果用户通过其他的方式(POST/HEAD等)来访问该资源都将返回403,而如果是Get来访问,因为我们设置了AutoRender=true,那么在执行完Get方法之后会自动执行Render函数,就会显示如下界面: @@ -152,16 +152,16 @@ MVC设计模式是目前Web应用开发中最常见的架构模式,通过分 index.tpl的代码如下所示,我们可以看到数据的设置和显示都是相当的简单方便: ```html - - - - beego welcome template - - -

Hello, world!{{.Username}},{{.Email}}

- - - + + + + beego welcome template + + +

Hello, world!{{.Username}},{{.Email}}

+ + + ``` ## links