何实施Slim就像中间件机制一样

时间:2016-10-27 19:10:44

标签: php frameworks slim middleware

我决定实现自己的小框架来实现依赖注入等等。

现在我正在坚持我的中间件实现。我可以在路由中添加中间件,但我想知道通过附加的中间件有多苗条循环。

我想以苗条的方式做到这一点,所以在每个中间件中我都可以返回请求或响应或下一个中间件。但是我如何对我附加的中间件进行迭代。

这是我要继续的堆栈

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

1 个答案:

答案 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.

(见Slim\MiddlewareAwareTrait#addMiddleware()