我的问题是我们可以回到中间件流水线来看一个例子
我们正在执行中间件1,中间件2,中间件3和中间件3。我希望Middleware1重新执行,然后再控制回Middleware3,我们可以这样做吗?
预先感谢
答案 0 :(得分:2)
不,您不能这样做。中间件在管道中被调用。这意味着,将启动一个中间件,该中间件将继续传递到管道中的下一个中间件,然后再传递到下一个中间件,依此类推。最终,随着管道的完成,每个中间件都有一种事后的方式。
通常如下所示:
Request
| → Middleware1
| | run
| | next() → Middleware2
| | | run
| | | next() → Middleware3
| | | | run
| | | | next() → {}
| | | | run after
| | | | return ↵
| | | ←
| | | run after
| | | return ↵
| | ←
| | run after
| | return ↵
| ←
| ⇒ Send response
由于这是一条严格的管道,只能沿一个方向运行,因此您不能随意跳来跳去。您只有机会调用管道中的下一个中间件或返回。
可以要做的是多次调用以下管道。例如,当发生错误时,StatusCodePages中间件执行此操作以重新执行状态代码页的管道:
Request
| → StatusCodePagesMiddleware
| | run
| | next() → Pipeline
| | | … throw an error
| | ← catch exception
| | run after
| | adjust parameters
| | next() → Run pipeline again with modified parameters do display error page
| | return ↵
| ←
| ⇒ Send response
请注意,这是一件非常特殊的事情,仅由于StatusCodePages中间件通常注册得很早并且因为它想重新运行完整管道,才起作用。
如果您希望对此进行更好的控制,则您甚至不应该将逻辑拆分为多个中间件。拥有一个内部逻辑非常受控的单一中间件可能是一个更好的主意。例如,该逻辑可以是另一个管道,也可以是简单的控制流。