IRIS MVC使用ExecutionRules实现中间件功能

目录结构

主目录withoutCtxNext

  1. —— main.go

代码示例

main.go

  1. /*
  2. Package main是处理程序执行流程的行为更改的简单示例,
  3. 通常我们需要`ctx.Next()`来调用,路由处理程序链中的下一个处理程序,
  4. 但是使用新的`ExecutionRules`,我们可以更改此默认行为。
  5. 请继续阅读以下内容。
  6. `Party#SetExecutionRules`改变处理程序本身之外的路由处理程序的执行流程
  7. For example, if for some reason the desired result is the (done or all) handlers to be executed no matter what
  8. even if no `ctx.Next()` is called in the previous handlers, including the begin(`Use`),
  9. the main(`Handle`) and the done(`Done`) handlers themselves, then:
  10. 例如,如果由于某种原因,期望的结果是(完成或所有)处理程序无论如何都要执行
  11. 即使在前面的处理程序中没有调用`ctx.Next()`,包括begin(`Use`),
  12. main(`Handle`)和done(`Done`)处理程序本身,然后:
  13. Party#SetExecutionRules(iris.ExecutionRules {
  14. Begin: iris.ExecutionOptions{Force: true},
  15. Main: iris.ExecutionOptions{Force: true},
  16. Done: iris.ExecutionOptions{Force: true},
  17. })
  18. 注意,如果`true`那么“break”处理程序链的唯一剩余方法是`ctx.StopExecution()`现在`ctx.Next()`无关紧要。
  19. 这些规则是按先后进行的,因此如果`Party`创建了一个子规则,那么同样的规则也将应用于该规则。
  20. 可以使用`Party #SetExecutionRules(iris.ExecutionRules {})`来重置这些规则(在`Party#Handle`之前)。
  21. 最常见的使用方案可以在Iris MVC应用程序中找到;
  22. 当我们想要特定mvc应用程序的`Party`的`Done`处理程序时
  23. 要执行,但我们不想在`exampleController #EndRequest`上添加`ctx.Next()` */
  24. package main
  25. import (
  26. "github.com/kataras/iris"
  27. "github.com/kataras/iris/mvc"
  28. )
  29. func main() {
  30. app := iris.New()
  31. app.Get("/", func(ctx iris.Context) { ctx.Redirect("/example") })
  32. // example := app.Party("/example")
  33. // example.SetExecutionRules && mvc.New(example) 或...
  34. m := mvc.New(app.Party("/example"))
  35. //重要
  36. //所有选项都可以用Force填充:true,所有的都会很好的兼容
  37. m.Router.SetExecutionRules(iris.ExecutionRules{
  38. //Begin: <- from `Use[all]` 到`Handle[last]` 程序执行顺序,执行all,即使缺少`ctx.Next()`也执行all。
  39. // Main: <- all `Handle` 执行顺序,执行所有>> >>。
  40. Done: iris.ExecutionOptions {Force:true},// < - 从`Handle [last]`到`Done [all]`程序执行顺序,执行全部>> >>。
  41. })
  42. m.Router.Done(doneHandler)
  43. // m.Router.Done(...)
  44. // ...
  45. m.Handle(&exampleController{})
  46. app.Run(iris.Addr(":8080"))
  47. }
  48. func doneHandler(ctx iris.Context) {
  49. ctx.WriteString("\nFrom Done Handler")
  50. }
  51. type exampleController struct{}
  52. func (c *exampleController) Get() string {
  53. return "From Main Handler"
  54. //注意,这里我们不绑定`Context`,我们不调用它的`Next()`
  55. //函数以调用`doneHandler`,
  56. //这是我们自动完成的,因为我们用`SetExecutionRules`改变了执行规则。
  57. //因此最终输出是:
  58. //来自Main Handler
  59. //来自Done Handler
  60. }