Goku

Golang Web Mvc Framework

View the Project on GitHub qleelulu/goku

Intro

Simple MVC project

Let us create a simple mvc project, show how goku work.

The project’s directory structure is like this:

.
├── app.go
└── gokudemo
    ├── config.go
    ├── controllers
    │   └── home.go
    ├── model
    ├── routes.go
    ├── static
    │   ├── css
    │   ├── img
    │   └── js
    └── views
        ├── home
        │   └── index.html
        └── shared
            └── layout.html

You can find this example in here.

Route

An URL request like “http://www.abc.com/home/index” will map to home controller’s index action.
This was rewrite by the routes:

var Routes []*goku.Route = []*goku.Route{
    &goku.Route{
        Name:     "static",
        IsStatic: true,
        Pattern:  "/public/(.*)",
    },
    &goku.Route{
        Name:    "default",
        Pattern: "/{controller}/{action}",
        Default: map[string]string{"controller": "home", "action": "index"},
    },
}

The static route set IsStatic to true, mean that if the url matched this route, will process the request as static file.
The default route mean that the url /user/info, will map to user controller’s info action, and the url / will map to home controller’s index action, because this is the default value.

We register the routes to goku server by this way (app.go) :

func main() {
    rt := &goku.RouteTable{Routes: gokudemo.Routes}
    middlewares := []goku.Middlewarer{}
    s := goku.CreateServer(rt, middlewares, gokudemo.Config)
    log.Fatal(s.ListenAndServe())
}

Controller & Action

Add a controller like this code(controllers/home.go):

package controllers

import (
    "github.com/QLeelulu/goku"
)

// home controller
var _ = goku.Controller("home").
// index action
Get("index", func (ctx *goku.HttpContext) goku.ActionResulter {
    ctx.ViewData["Message"] = "Hello World"
    return ctx.View(nil)
})

This code register a home controller, with a action named index for http GET methed, and add a viewdate Message can be use in the view.

If the controllers register in the other packages, we must import it:

import _ "gokudemo/gokudemo/controllers" 

we just import it but ignore it by _.

View

In the home controller’s index action, we render view by return ctx.View(nil). This will find the view template file by the location /views/home/index.html. And the default layout template is in /views/shared/layout.html.

the layout.html:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Goku Demo</title>
</head>
<body>
    <h1>Goku Demo</h1>
    {{ template "body" . }}
</body>
</html>

the /views/home/index.html:

{{define "body"}}
    {{.Data.Message}}
{{end}}

We get the data pass from the action in view by { {.Data.Message} }.

Run the app

$ go run app.go 
2012/11/23 23:06:51 Server start on :8080
2012/11/23 23:07:13 D 200 GET / 
2012/11/23 23:07:13 N 404 GET /favicon.ico

Now you can open a web-browser with the URL http://127.0.0.1:8080 to see what happen.