mirror of
https://github.com/kataras/iris.git
synced 2025-12-18 02:17:05 +00:00
New Context.SetLogoutFunc/Logout and SetFunc/CallFunc methods
Read HISTORY.md
This commit is contained in:
109
_examples/routing/writing-a-middleware/share-funcs/main.go
Normal file
109
_examples/routing/writing-a-middleware/share-funcs/main.go
Normal file
@@ -0,0 +1,109 @@
|
||||
// Package main shows how you can share a
|
||||
// function between handlers of the same chain.
|
||||
// Note that, this case is very rarely used and it exists,
|
||||
// mostly, for 3rd-party middleware creators.
|
||||
//
|
||||
// The middleware creator registers a dynamic function by Context.SetFunc and
|
||||
// the route handler just needs to call Context.CallFunc(funcName, arguments),
|
||||
// without knowning what is the specific middleware's implementation or who was the creator
|
||||
// of that function, it may be a basicauth middleware's logout or session's logout.
|
||||
//
|
||||
// See Context.SetLogoutFunc and Context.Logout methods too (these are not covered here).
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/kataras/iris/v12"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := newApp()
|
||||
|
||||
// GET: http://localhost:8080
|
||||
app.Listen(":8080")
|
||||
}
|
||||
|
||||
func newApp() *iris.Application {
|
||||
app := iris.New()
|
||||
app.Use(middleware)
|
||||
// OR app.UseRouter(middleware)
|
||||
// to register it everywhere,
|
||||
// including the HTTP errors.
|
||||
|
||||
app.Get("/", handler)
|
||||
app.Get("/2", middleware2, handler2)
|
||||
app.Get("/3", middleware3, handler3)
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
// Assume: this is a middleware which does not export
|
||||
// the 'hello' function for several reasons
|
||||
// but we offer a 'greeting' optional feature to the route handler.
|
||||
func middleware(ctx iris.Context) {
|
||||
ctx.SetFunc("greet", hello)
|
||||
ctx.Next()
|
||||
}
|
||||
|
||||
// Assume: this is a handler which needs to "greet" the client but
|
||||
// the function for that job is not predictable,
|
||||
// it may change - dynamically (SetFunc) - depending on
|
||||
// the middlewares registered before this route handler.
|
||||
// E.g. it may be a "Hello $name" or "Greetings $Name".
|
||||
func handler(ctx iris.Context) {
|
||||
outputs, err := ctx.CallFunc("greet", "Gophers")
|
||||
if err != nil {
|
||||
ctx.StopWithError(iris.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
response := outputs[0].Interface().(string)
|
||||
ctx.WriteString(response)
|
||||
}
|
||||
|
||||
func middleware2(ctx iris.Context) {
|
||||
ctx.SetFunc("greet", sayHello)
|
||||
ctx.Next()
|
||||
}
|
||||
|
||||
func handler2(ctx iris.Context) {
|
||||
_, err := ctx.CallFunc("greet", "Gophers [2]")
|
||||
if err != nil {
|
||||
ctx.StopWithError(iris.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func middleware3(ctx iris.Context) {
|
||||
ctx.SetFunc("job", function3)
|
||||
ctx.Next()
|
||||
}
|
||||
|
||||
func handler3(ctx iris.Context) {
|
||||
_, err := ctx.CallFunc("job")
|
||||
if err != nil {
|
||||
ctx.StopWithError(iris.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.WriteString("OK, job was executed.\nSee the command prompt.")
|
||||
}
|
||||
|
||||
/*
|
||||
| ------------------------ |
|
||||
| function implementations |
|
||||
| ------------------------ |
|
||||
*/
|
||||
|
||||
func hello(name string) string {
|
||||
return fmt.Sprintf("Hello, %s!", name)
|
||||
}
|
||||
|
||||
func sayHello(ctx iris.Context, name string) {
|
||||
ctx.WriteString(hello(name))
|
||||
}
|
||||
|
||||
func function3() {
|
||||
fmt.Printf("function3 called\n")
|
||||
}
|
||||
Reference in New Issue
Block a user