我决定实现自己的小框架来实现依赖注入等等。
现在我正在坚持我的中间件实现。我可以在路由中添加中间件,但我想知道通过附加的中间件有多苗条循环。
我想以苗条的方式做到这一点,所以在每个中间件中我都可以返回请求或响应或下一个中间件。但是我如何对我附加的中间件进行迭代。
这是我要继续的堆栈
class MiddlewareStack
{
private $stack;
public function addMiddleware(Middleware $middleware)
{
$this->stack[] = $middleware;
}
public function processMiddleware(Request $request, Response $response)
{
}
}
那就是中间件界面
public function __invoke(Request $request, Response $response, $next);
我想
return $next($request,$response);
在我的中间件类中,或者仅仅是响应或请求。
以下是如何创建可调用的middlware。
http://www.slimframework.com/docs/concepts/middleware.html#invokable-class-middleware-example
答案 0 :(得分:3)
Slim 3首先将自己添加到堆栈中,该堆栈是执行路径的Slim\App#__invoke()
。
然后,当你添加一个中间件时,它会执行以下操作:(在此{slim}之前,在DeferredCallable
内包含可调用的(匿名函数/可调用类),这有助于同等地执行函数和类(参见{{ 3}})。
protected function addMiddleware(callable $callable) // $callable is a DeferredCallable
{
$next = $this->stack->top(); // when it the first middleware this would be the route execution
$this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) {
$result = call_user_func($callable, $req, $res, $next);
return $result;
};
}
(这只是简单的代码,完整代码请参阅:Slim\App#add()
)
因此,堆栈顶部的中间件也会执行其他中间件,因为它是在下一个方法中提供的。
然后,当您想要执行中间件时,获取位于堆栈顶部的中间件并执行它。
$start = $this->stack->top();
$resp = $start($req, $res);
// $resp is now the final response.