icon-cookie
The website uses cookies to optimize your user experience. Using this website grants us the permission to collect certain information essential to the provision of our services to you, but you may change the cookie settings within your browser any time you wish. Learn more
I agree
blank_error__heading
blank_error__body
Text direction?

MVC · Go Web Iris中文网

MVC介绍

run2

Iris对MVC(模型视图控制器)模式有一流的支持,您在其他任何地方都找不到这些东西

Iris web框架支持请求数据、模型、持久数据和以最快的速度执行的绑定。

特性

支持所有HTTP方法,例如,如果想要提供GET,那么控制器应该有一个名为Get()的函数,您可以定义多个方法函数在同一个Controller中提供。

通过BeforeActivation自定义事件回调,每个控制器,将自定义控制器的struct的方法作为具有自定义路径(即使使用正则表达式参数化路径)的处理程序提供。

示例代码:

    import (
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
    )
    func main() {
        app := iris.New()
        mvc.Configure(app.Party("/root"), myMVC)
        app.Run(iris.Addr(":8080"))
    }
    func myMVC(app *mvc.Application) {
        // app.Register(...)
        // app.Router.Use/UseGlobal/Done(...)
        app.Handle(new(MyController))
    }
    type MyController struct {}
    func (m *MyController) BeforeActivation(b mvc.BeforeActivation) {
        // b.Dependencies().Add/Remove
        // b.Router().Use/UseGlobal/Done // 以及您已经知道的任何标准API调用

        // 1-> Method
        // 2-> Path
        // 3-> 控制器的函数名称将被解析为处理程序
        // 4-> 应该在MyCustomHandler之前运行的任何处理程序
        b.Handle("GET", "/something/{id:long}", "MyCustomHandler", anyMiddleware...)
    }
    // GET: http://localhost:8080/root
    func (m *MyController) Get() string { return "Hey" }
    // GET: http://localhost:8080/root/something/{id:long}
    func (m *MyController) MyCustomHandler(id int64) string { return "MyCustomHandler says Hey" }

Controller结构中的持久性数据(在请求之间共享数据),通过定义对依赖项的服务或具有Singleton控制器作用域。

共享控制器之间的依赖关系或在父MVC应用程序上注册它们,并能够在Controller内的BeforeActivation可选事件回调中修改每个控制器的依赖关系,即 func(c * MyController)BeforeActivation(b mvc.BeforeActivation){b.Dependencies ()add/remove(...)} 。

访问Context作为控制器的字段(没有手动绑定是neede),即Ctx iris.Context或通过方法的输入参数,即 func(ctx iris.Context,otherArguments ...)。

Controller结构中的模型(在Method函数中设置并由View呈现)。 您可以从控制器的方法返回模型,或者在请求生命周期中设置字段,并在同一请求生命周期中将该字段返回到另一个方法。 像以前一样,mvc应用程序有自己的路由器,这是一种iris/route.Party,标准的 iris api。控制器可以注册到任何一方,包括子域名,Party的开始和完成处理程序按预期工作。

可选的BeginRequest(ctx)函数在方法执行之前执行任何初始化,对调用中间件或许多方法使用相同的数据集合很有用。 可选的EndRequest(ctx)函数,用于在执行任何方法后执行任何终结。

继承,递归,参见我们的mvc.SessionController,它将Session sessions.Session和Manager sessions.Sessions作为嵌入字段,由其BeginRequest填充,在这里。这只是一个示例,您可以使用从管理器的Start作为动态依赖关系返回到MVC应用程序的sessions.Session,即mvcApp.Register(sessions.New(sessions.Config {Cookie:“iris_session_id”})。 )。

通过控制器方法的输入参数访问动态路径参数,不需要绑定。当您使用Iris的默认语法来解析来自控制器的处理程序时,您需要使用By字来为方法添加后缀,大写是一个新的子路径。例: 如这种形式 mvc.New(app.Party("/user")).Handle(new(user.Controller)) 则:

  • func(*Controller) Get() - GET:/user.
  • func(*Controller) Post() - POST:/user.
  • func(*Controller) GetLogin() - GET:/user/login
  • func(*Controller) PostLogin() - POST:/user/login
  • func(*Controller) GetProfileFollowers() - GET:/user/profile/followers
  • func(*Controller) PostProfileFollowers() - POST:/user/profile/followers
  • func(*Controller) GetBy(id int64) - GET:/user/{param:long}
  • func(*Controller) PostBy(id int64) - POST:/user/{param:long}

这样也是哦 mvc.New(app.Party("/profile")).Handle(new(profile.Controller))

  • func(*Controller) GetBy(username string) - GET:/profile/{param:string}

mvc.New(app.Party("/assets")).Handle(new(file.Controller))

  • func(*Controller) GetByWildard(path string) - GET:/assets/{param:path}

方法函数接收器支持的类型:int,int64,bool和string。

通过输出参数响应,可选,即

func(c *ExampleController) Get() string |
                                (string, string) |
                                (string, int) |
                                int |
                                (int, string) |
                                (string, error) |
                                error |
                                (int, error) |
                                (any, bool) |
                                (customStruct, error) |
                                customStruct |
                                (customStruct, int) |
                                (customStruct, string) |
                                mvc.Result or (mvc.Result, error)

当mvc.Result是一个interface时,只包含该函数::Dispatch(ctx iris.Context)

使用Iris MVC进行代码重用

通过创建彼此独立的组件,开发人员能够在其他应用程序中快速轻松地重用组件。对于具有不同数据的另一个应用程序,可以为一个应用程序重构相同(或类似)的视图,因为视图只是处理数据如何显示给用户。

如果您不熟悉后端Web开发,请首先阅读有关MVC架构模式的内容,一个好的开始就是。 维基百科文章

快速MVC教程第1部分

此示例等同于https://github.com/kataras/iris/blob/master/_examples/hello-world/main.go

似乎你必须编写额外的代码并不值得,但请记住, 这个例子没有使用iris mvc功能,比如Model,Persistence或View引擎都没有Session, 它对于学习目的来说非常简单,可能你在你的应用程序的任何地方都不会使用简单的控制器。

在我的个人笔记本电脑上,在每个20MB吞吐量的“/ hello”路径上使用MVC的这个例子的成本是每个20MB吞吐量大约2MB, 大多数应用程序都可以容忍,但你可以选择最适合你的Iris,低级处理程序: 性能或高级控制器:在大型应用程序上更易于维护和更小的代码库。

    package main
    import (
        "github.com/kataras/iris"
        "github.com/kataras/iris/mvc"
        "github.com/kataras/iris/middleware/logger"
        "github.com/kataras/iris/middleware/recover"
    )
    func main() {
        app := iris.New()
        //(可选)添加两个内置处理程序
        // 可以从任何http相关的恐慌中恢复
        // 并将请求记录到终端。
        app.Use(recover.New())
        app.Use(logger.New())

        // 基于根路由器服务控制器, "/".
        mvc.New(app).Handle(new(ExampleController))

        // http://localhost:8080
        // http://localhost:8080/ping
        // http://localhost:8080/hello
        // http://localhost:8080/custom_path
        app.Run(iris.Addr(":8080"))
    }
    //ExampleController服务于 "/", "/ping" and "/hello".
    type ExampleController struct{}
    // Get serves
    // Method:   GET
    // Resource: http://localhost:8080
    func (c *ExampleController) Get() mvc.Result {
        return mvc.Response{
            ContentType: "text/html",
            Text:        "<h1>Welcome</h1>",
        }
    }
    // GetPing serves
    // Method:   GET
    // Resource: http://localhost:8080/ping
    func (c *ExampleController) GetPing() string {
        return "pong"
    }
    // GetHello serves
    // Method:   GET
    // Resource: http://localhost:8080/hello
    func (c *ExampleController) GetHello() interface{} {
        return map[string]string{"message": "Hello Iris!"}
    }
    //在控制器适应主应用程序之前调用一次BeforeActivation
    //当然在服务器运行之前。
    //在版本9之后,您还可以为特定控制器的方法添加自定义路由。
    //在这里您可以注册自定义方法的处理程序
    //使用带有`ca.Router`的标准路由器做一些你可以做的事情,没有mvc,
    //并添加将绑定到控制器的字段或方法函数的输入参数的依赖项。
    func (c *ExampleController) BeforeActivation(b mvc.BeforeActivation) {
        anyMiddlewareHere := func(ctx iris.Context) {
            ctx.Application().Logger().Warnf("Inside /custom_path")
            ctx.Next()
        }
        b.Handle("GET", "/custom_path", "CustomHandlerWithoutFollowingTheNamingGuide", anyMiddlewareHere)

        //甚至添加基于此控制器路由器的全局中间件,
        //在这个例子中是根“/”:
        // b.Router()。使用(myMiddleware)
    }
    // CustomHandlerWithoutFollowingTheNamingGuide serves
    // Method:   GET
    // Resource: http://localhost:8080/custom_path
    func (c *ExampleController) CustomHandlerWithoutFollowingTheNamingGuide() string {
        return "hello from the custom handler without following the naming guide"
    }
    // GetUserBy serves
    // Method:   GET
    // Resource: http://localhost:8080/user/{username:string}
    //是一个保留的“关键字”来告诉框架你要去的
    //在函数的输入参数中绑定路径参数,它也是
    //有助于在同一控制器中使用“Get”和“GetBy”。
    //
    // func (c *ExampleController) GetUserBy(username string) mvc.Result {
    //     return mvc.View{
    //         Name: "user/username.html",
    //         Data: username,
    //     }
    // }
    /*
    可以使用多个,工厂会确定
    为每条路线注册了正确的http方法
    对于此控制器,如果需要,请取消注释:
    */
    func (c *ExampleController) Post() {}
    func (c *ExampleController) Put() {}
    func (c *ExampleController) Delete() {}
    func (c *ExampleController) Connect() {}
    func (c *ExampleController) Head() {}
    func (c *ExampleController) Patch() {}
    func (c *ExampleController) Options() {}
    func (c *ExampleController) Trace() {}
    */
    /*
    func (c *ExampleController) All() {}
    //        OR
    func (c *ExampleController) Any() {}

    func (c *ExampleController) BeforeActivation(b mvc.BeforeActivation) {
        // 1 -> the HTTP Method
        // 2 -> the route's path
        // 3 -> this controller's method name that should be handler for that route.
        b.Handle("GET", "/mypath/{param}", "DoIt", optionalMiddlewareHere...)
    }
    // After activation, all dependencies are set-ed - so read only access on them
    // but still possible to add custom controller or simple standard handlers.
    func (c *ExampleController) AfterActivation(a mvc.AfterActivation) {}
    */

_examples / mvc和mvc / controller_test.go 文件用简单的范例解释每个功能, 他们展示了如何利用Iris MVC Binder,Iris MVC模型以及更多......

在控制器中以HTTP方法(Get,Post,Put,Delete ...)为前缀的每个导出的func都可以作为HTTP端点调用。在上面的示例中,所有func都将一个字符串写入响应。请注意每种方法之前的注释。

HTTP端点是Web应用程序中的可定位URL,例如http:// localhost:8080 / helloworld,并结合使用的协议:HTTP,Web服务器的网络位置(包括TCP端口):localhost:8080和目标URI / helloworld。

第一条评论声明这是一个HTTP GET方法,它通过将“/ helloworld”附加到基本URL来调用。第三个注释指定通过将“/ helloworld / welcome”附加到URL来调用的HTTP GET方法。

Controller知道如何处理GetBy上的“name”或GetWelcomeBy中的“name”和“numTimes”,因为By关键字,并且构建没有样板的动态路由;第三个注释指定HTTP GET动态方法, 该方法由任何以“/ helloworld / welcome”开头并后跟两个路径部分的URL调用,第一个可以接受任何值,第二个只能接受数字, i,e :“http:// localhost:8080 / helloworld / welcome / golang / 32719”, 否则将向客户端发送404 Not Found HTTP Error。

单击movieMVC到“movieMVC应用程序”子部分。

Measure
Measure
Related Notes
Get a free MyMarkup account to save this article and view it later on any device.
Create account

End User License Agreement

Summary | 1 Annotation
请求数据、模型、持久数据和以最快的速度执行的绑定
2020/07/08 05:14