Structuring examples - Pushed to iris-contrib/examples as well.

Former-commit-id: 24ee6ce233d83f0b394afc6c69b5a88243406045
This commit is contained in:
Gerasimos (Makis) Maropoulos 2017-10-22 16:04:11 +03:00
parent f95986d0c0
commit 11277f12a0
42 changed files with 32 additions and 270 deletions

View File

@ -16,17 +16,18 @@ It doesn't always contain the "best ways" but it does cover each important featu
- [POC: Convert the medium-sized project "Parrot" from native to Iris](https://github.com/iris-contrib/parrot)
- [POC: Isomorphic react/hot reloadable/redux/css-modules starter kit](https://github.com/kataras/iris-starter-kit)
- [Tutorial: DropzoneJS Uploader](tutorial/dropzonejs)
- [Tutorial: Caddy](tutorial/caddy)
### Structuring
Nothing stops you from using your favorite folder structure. Iris is a low level web framework, it has got MVC first-class support but it doesn't limit your folder structure, this is your choice.
Structuring depends on your own needs. We can't tell you how to design your own application for sure but you're free to take a closer look to the examples below; you may find something useful that you can borrow for your app
Structuring depends on your own needs. We can't tell you how to design your own application for sure but you're free to take a closer look to the examples below; you may find something useful that you can borrow for your app;
- [Example 1](mvc/login)
- [Example 2](structuring/mvc)
- [Example 3](structuring/handler-based)
- [Example 4](mvc/overview)
- [Bootstrapper](structuring/bootstrap)
- [MVC with Repository and Service layer Overview](structuring/mvc-plus-repository-and-service-layers)
- [Login (MVC with Single Responsibility package)](structuring/login-mvc-single-responsible-package)
- [Login (MVC with Datamodels, Datasource, Repository and Service layer)](structuring/login-mvc)
### HTTP Listening

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,20 @@
package main
import (
"github.com/kataras/iris/_examples/structuring/bootstrap/bootstrap"
"github.com/kataras/iris/_examples/structuring/bootstrap/middleware/identity"
"github.com/kataras/iris/_examples/structuring/bootstrap/routes"
)
var app = bootstrap.New("Awesome App", "kataras2006@hotmail.com",
identity.Configure,
routes.Configure,
)
func init() {
app.Bootstrap()
}
func main() {
app.Listen(":8080")
}

View File

@ -6,7 +6,7 @@ import (
"github.com/kataras/iris/httptest"
)
// TestApp runs by `$ go test -v`.
// go test -v
func TestApp(t *testing.T) {
e := httptest.New(t, app.Application)

View File

@ -5,7 +5,7 @@ import (
"github.com/kataras/iris"
"github.com/kataras/iris/_examples/structuring/handler-based/bootstrap"
"github.com/kataras/iris/_examples/structuring/bootstrap/bootstrap"
)
// New returns a new handler which adds some headers and view data

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,7 +1,7 @@
package routes
import (
"github.com/kataras/iris/_examples/structuring/handler-based/bootstrap"
"github.com/kataras/iris/_examples/structuring/bootstrap/bootstrap"
)
// Configure registers the necessary routes to the app.

View File

@ -1,20 +0,0 @@
package main
import (
"github.com/kataras/iris/_examples/structuring/handler-based/bootstrap"
"github.com/kataras/iris/_examples/structuring/handler-based/middleware/identity"
"github.com/kataras/iris/_examples/structuring/handler-based/routes"
)
var app = bootstrap.New("Awesome App", "kataras2006@hotmail.com",
identity.Configure,
routes.Configure,
)
func init() {
app.Bootstrap()
}
func main() {
app.Listen(":8080")
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -3,7 +3,7 @@ package main
import (
"time"
"github.com/kataras/iris/_examples/mvc/login/_ugly/user"
"github.com/kataras/iris/_examples/structuring/login-single-responsibility-package/user"
"github.com/kataras/iris"
"github.com/kataras/iris/sessions"

View File

@ -0,0 +1 @@
# Please navigate to the [_examples/mvc/login](https://github.com/kataras/iris/tree/master/_examples/mvc/login)

View File

@ -0,0 +1 @@
# Please navigate to the [_examples/mvc/overview](https://github.com/kataras/iris/tree/master/_examples/mvc/overview)

View File

@ -1,144 +0,0 @@
package app
import (
"fmt"
"time"
"github.com/gorilla/securecookie"
"github.com/kataras/iris"
"github.com/kataras/iris/middleware/logger"
"github.com/kataras/iris/middleware/recover"
"github.com/kataras/iris/sessions"
"github.com/kataras/iris/_examples/structuring/mvc/app/controllers/follower"
"github.com/kataras/iris/_examples/structuring/mvc/app/controllers/following"
"github.com/kataras/iris/_examples/structuring/mvc/app/controllers/index"
"github.com/kataras/iris/_examples/structuring/mvc/app/controllers/like"
)
// Application is our application wrapper and bootstrapper, keeps our settings.
type Application struct {
*iris.Application
Name string
Owner string
SpawnDate time.Time
Sessions *sessions.Sessions
}
// NewApplication returns a new named Application.
func NewApplication(name, owner string) *Application {
return &Application{
Name: name,
Owner: owner,
Application: iris.New(),
SpawnDate: time.Now(),
}
}
// begin sends the app's identification info.
func (app *Application) begin(ctx iris.Context) {
// response headers
ctx.Header("App-Name", app.Name)
ctx.Header("App-Owner", app.Owner)
ctx.Header("App-Since", time.Since(app.SpawnDate).String())
ctx.Header("Server", "Iris: https://iris-go.com")
// view data if ctx.View or c.Tmpl = "$page.html" will be called next.
ctx.ViewData("AppName", app.Name)
ctx.ViewData("AppOwner", app.Owner)
ctx.Next()
}
// SetupViews loads the templates.
func (app *Application) SetupViews(viewsDir string) {
app.RegisterView(iris.HTML(viewsDir, ".html").Layout("shared/layout.html"))
}
// SetupSessions initializes the sessions, optionally.
func (app *Application) SetupSessions(expires time.Duration, cookieHashKey, cookieBlockKey []byte) {
app.Sessions = sessions.New(sessions.Config{
Cookie: "SECRET_SESS_COOKIE_" + app.Name,
Expires: expires,
Encoding: securecookie.New(cookieHashKey, cookieBlockKey),
})
}
// SetupErrorHandlers prepares the http error handlers (>=400).
// Remember that error handlers in Iris have their own middleware ecosystem
// so the route's middlewares are not running when an http error happened.
// So if we want a logger we have to re-create one, here we will customize that logger as well.
func (app *Application) SetupErrorHandlers() {
httpErrStatusLogger := logger.New(logger.Config{
Status: true,
IP: true,
Method: true,
Path: true,
MessageContextKey: "message",
LogFunc: func(now time.Time, latency time.Duration,
status, ip, method, path string,
message interface{}) {
line := fmt.Sprintf("%v %4v %s %s %s", status, latency, ip, method, path)
if message != nil {
line += fmt.Sprintf(" %v", message)
}
app.Logger().Warn(line)
},
})
app.OnAnyErrorCode(app.begin, httpErrStatusLogger, func(ctx iris.Context) {
err := iris.Map{
"app": app.Name,
"status": ctx.GetStatusCode(),
"message": ctx.Values().GetString("message"),
}
if jsonOutput, _ := ctx.URLParamBool("json"); jsonOutput {
ctx.JSON(err)
return
}
ctx.ViewData("Err", err)
ctx.ViewData("Title", "Error")
ctx.View("shared/error.html")
})
}
// SetupRouter registers the available routes from the "controllers" package.
func (app *Application) SetupRouter() {
app.Use(recover.New())
app.Use(app.begin)
app.Use(iris.Gzip)
app.Favicon("./public/favicon.ico")
app.StaticWeb("/public", "./public")
app.Use(logger.New())
app.Controller("/", new(index.Controller))
app.Controller("/follower", new(follower.Controller))
app.Controller("/following", new(following.Controller))
app.Controller("/like", new(like.Controller))
}
// Instance is our global application bootstrap instance.
var Instance = NewApplication("My Awesome App", "kataras2006@hotmail.com")
// Boot starts our default instance appolication.
func Boot(runner iris.Runner, configurators ...iris.Configurator) {
Instance.SetupViews("./app/views")
Instance.SetupSessions(24*time.Hour,
[]byte("the-big-and-secret-fash-key-here"),
[]byte("lot-secret-of-characters-big-too"),
)
Instance.SetupErrorHandlers()
Instance.SetupRouter()
Instance.Run(runner, configurators...)
}

View File

@ -1,13 +0,0 @@
package follower
import (
"github.com/kataras/iris"
)
type Controller struct {
iris.Controller
}
func (c *Controller) GetBy(id int64) {
c.Ctx.Writef("from "+c.Route().Path()+" with ID: %d", id)
}

View File

@ -1,13 +0,0 @@
package following
import (
"github.com/kataras/iris"
)
type Controller struct {
iris.Controller
}
func (c *Controller) GetBy(id int64) {
c.Ctx.Writef("from "+c.Route().Path()+" with ID: %d", id)
}

View File

@ -1,14 +0,0 @@
package index
import (
"github.com/kataras/iris"
)
type Controller struct {
iris.Controller
}
func (c *Controller) Get() {
c.Data["Title"] = "Index"
c.Tmpl = "index.html"
}

View File

@ -1,13 +0,0 @@
package like
import (
"github.com/kataras/iris"
)
type Controller struct {
iris.Controller
}
func (c *Controller) GetBy(id int64) {
c.Ctx.Writef("from "+c.Route().Path()+" with ID: %d", id)
}

View File

@ -1 +0,0 @@
<h1>Welcome!!</h1>

View File

@ -1,5 +0,0 @@
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<h3>{{.Err.status}}</h3>
<h4>{{.Err.message}}</h4>

View File

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<title>{{.Title}} - {{.AppName}}</title>
</head>
<body>
<div>
<!-- Render the current template here -->
{{ yield }}
<hr />
<footer>
<p>&copy; 2017 - {{.AppOwner}}</p>
</footer>
</div>
</body>
</html>

View File

@ -1,15 +0,0 @@
package main
import (
"github.com/kataras/iris"
"github.com/kataras/iris/_examples/structuring/mvc/app"
)
func main() {
// http://localhost:8080
// http://localhost:8080/follower/42
// http://localhost:8080/following/42
// http://localhost:8080/like/42
app.Boot(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed), iris.WithoutVersionChecker)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB