mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 18:51:03 +01:00
Structuring examples - Pushed to iris-contrib/examples as well.
Former-commit-id: 24ee6ce233d83f0b394afc6c69b5a88243406045
This commit is contained in:
parent
f95986d0c0
commit
11277f12a0
|
@ -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: 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)
|
- [POC: Isomorphic react/hot reloadable/redux/css-modules starter kit](https://github.com/kataras/iris-starter-kit)
|
||||||
- [Tutorial: DropzoneJS Uploader](tutorial/dropzonejs)
|
- [Tutorial: DropzoneJS Uploader](tutorial/dropzonejs)
|
||||||
|
- [Tutorial: Caddy](tutorial/caddy)
|
||||||
|
|
||||||
### Structuring
|
### 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.
|
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)
|
- [Bootstrapper](structuring/bootstrap)
|
||||||
- [Example 2](structuring/mvc)
|
- [MVC with Repository and Service layer Overview](structuring/mvc-plus-repository-and-service-layers)
|
||||||
- [Example 3](structuring/handler-based)
|
- [Login (MVC with Single Responsibility package)](structuring/login-mvc-single-responsible-package)
|
||||||
- [Example 4](mvc/overview)
|
- [Login (MVC with Datamodels, Datasource, Repository and Service layer)](structuring/login-mvc)
|
||||||
|
|
||||||
### HTTP Listening
|
### HTTP Listening
|
||||||
|
|
||||||
|
|
BIN
_examples/mvc/login/folder_structure.png
Normal file
BIN
_examples/mvc/login/folder_structure.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
_examples/structuring/bootstrap/folder_structure.png
Normal file
BIN
_examples/structuring/bootstrap/folder_structure.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
20
_examples/structuring/bootstrap/main.go
Normal file
20
_examples/structuring/bootstrap/main.go
Normal 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"
|
"github.com/kataras/iris/httptest"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestApp runs by `$ go test -v`.
|
// go test -v
|
||||||
func TestApp(t *testing.T) {
|
func TestApp(t *testing.T) {
|
||||||
e := httptest.New(t, app.Application)
|
e := httptest.New(t, app.Application)
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
|
|
||||||
"github.com/kataras/iris"
|
"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
|
// 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
|
package routes
|
||||||
|
|
||||||
import (
|
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.
|
// 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 (
|
import (
|
||||||
"time"
|
"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"
|
||||||
"github.com/kataras/iris/sessions"
|
"github.com/kataras/iris/sessions"
|
1
_examples/structuring/login-mvc/README.md
Normal file
1
_examples/structuring/login-mvc/README.md
Normal file
|
@ -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)
|
|
@ -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>© 2017 - {{.AppOwner}}</p>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -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 |
Loading…
Reference in New Issue
Block a user