La mayor parte del marco tradicional MVC se basa en el diseño de la cartografía de Acción de postfix, sin embargo, es ahora popular en la arquitectura web de estilo REST. Aunque el uso de filtro o reescribir la reescritura de URL se pueden lograr a través de una URL al estilo REST, pero ¿por qué no diseñar un nuevo marco MVC estilo REST? Esta sección se basa en esta idea sobre la manera de empezar de cero para diseñar un marco MVC estilo REST basada en el controlador, para maximizar el desarrollo de aplicaciones Web simplificación o incluso escribir una sola línea de código para lograr el "Hola, mundo". world".
Patrón de diseño MVC es el modelo más común marco de desarrollo de aplicaciones Web, separando Model (modelo), View (vista) y el controlador (controlador) que se puede lograr más fácilmente la interfaz de usuario fácilmente extensible (UI). Modelo se refiere al Fondo de los datos devueltos; Ver refiere a la necesidad de representar la página, por lo general una página de plantilla, el contenido suele traducirse HTML; Controller se refiere a los desarrolladores web escribir controladores manejan diferentes URL, tales como la ruta descrita en el apartado anterior se una petición de URL enviada al controlador de procesos, control de todo el marco MVC juega un papel central, responsable del manejo de la lógica de negocio, por lo que el controlador es una parte esencial del marco conjunto, modelo y la vista de algunas de las necesidades de negocio no pueden escribir, por ejemplo, no hay procesamiento de la lógica de procesamiento de datos, no hay salida de la página 302 y similares no es necesario ajustar el modelo y la vista, pero el controlador de esta parte es fundamental.
Sección anterior describe la función de enrutamiento para lograr una estructura registrada, y la estructura implementa enfoque REST, así que tenemos que diseñar un controlador de clase de base de procesamiento de la lógica, donde el diseño principal de los dos tipos, una estructura, una interfaz
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) //Initialize the context and subclass name
Prepare() //some processing before execution begins
Get() //method = GET processing
Post() //method = POST processing
Delete() //method = DELETE processing
Put() //method = PUT handling
Head() //method = HEAD processing
Patch() //method = PATCH treatment
Options() //method = OPTIONS processing
Finish() //executed after completion of treatment
Render() error //method executed after the corresponding method to render the page
}
A continuación, agregue la función descrita anteriormente, cuando una ruta se define el tipo ControllerInterface, siempre y cuando podamos implementar esta interfaz, por lo que nuestro controlador clase base para lograr los siguientes métodos:
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) Finish() {
}
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) 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) 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) 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)
}
}
return nil
}
func (c *Controller) Redirect(url string, code int) {
c.Ct.Redirect(code, url)
}
En la clase base del controlador ya implementa las funciones de interfaz definidas realizadas por encaminar el controlador apropiado principios url acuerdo será seguido por la aplicación de los siguientes:
Init () inicializa Prepare () antes de la ejecución de la inicialización, cada subclase puede heredar para implementar el método de la función () dependiendo del método para realizar diferentes funciones: GET, POST, PUT, HEAD, etc subclases para implementar estos funciones, si no se logra, entonces el valor por defecto es 403 Render () opcional, de acuerdo a una variable global para determinar si se debe ejecutar AutoRender Finalizar () después de la ejecución de la acción, cada subclase hereda la función se puede lograr
Por encima beego clase base Marco para completar el diseño del controlador, entonces tenemos en nuestra aplicación podemos diseñar nuestro enfoque:
package controllers
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Data["Username"] = "astaxie"
this.Data["Email"] = "[email protected]"
this.TplNames = "index.tpl"
}
La forma en que hemos logrado anteriormente MainController subclase, implementa Obtiene el método, por lo que si el usuario a través de otros medios (POST / cabeza, etc) para acceder al recurso devolverá 403, y si se trata Obtén acceso, ya que nos fijamos el AutoRender = true, entonces desempeñar en la aplicación del método Get se realiza de forma automática después de la función Render, se mostrará la siguiente interfaz:
se muestra el código index.tpl a continuación, podemos ver el conjunto de datos y la visualización son muy simples:
<!DOCTYPE html>
<html>
<head>
<title>beego welcome template</title>
</head>
<body>
<h1>Hello, world!{{.Username}},{{.Email}}</h1>
</body>
</html>
- Directory
- Previous section: Customized routers
- Next section: Logs and configurations