1
0
mirror of https://github.com/kataras/iris.git synced 2026-06-10 07:33:42 +00:00

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
+6 -5
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

+20
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")
}
@@ -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)
@@ -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

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

@@ -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.
@@ -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

@@ -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"
@@ -0,0 +1 @@
# Please navigate to the [_examples/mvc/login](https://github.com/kataras/iris/tree/master/_examples/mvc/login)
@@ -0,0 +1 @@
# Please navigate to the [_examples/mvc/overview](https://github.com/kataras/iris/tree/master/_examples/mvc/overview)
-144
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...)
}
@@ -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)
}
@@ -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)
}
@@ -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"
}
@@ -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)
}
@@ -1 +0,0 @@
<h1>Welcome!!</h1>
@@ -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>
@@ -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>
-15
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