interface Middleware
{
public function handle($request, Closure $next);
}
class MiddlewareCollection
{
private $middlewares;
private $request;
public function __construct(Array $middlewares, $request)
{
$this->middlewares = $middlewares;
$this->request = $request;
}
public function run()
{
$this->next(current($this->middlewares), $this->request);
}
private function next(Middleware $middleware, $request)
{
$middleware->handle($request, function($request) {
//How can I call the next middleware?
});
}
}
class FirstMiddleware implements Middleware
{
public function handle($request, Closure $next) {
echo $request.'first ';
return $next($request);
}
}
class SecondMiddleware implements Middleware
{
public function handle($request, Closure $next) {
echo $request.'second ';
return $next($request);
}
}
class ThirdMiddleware implements Middleware
{
public function handle($request, Closure $next) {
echo $request.'third ';
return $next($request);
}
}
$middlewares = [
'first' => new FirstMiddleware(),
'second' => new SecondMiddleware(),
'third' => new ThirdMiddleware()
];
$middlewareCollection = new MiddlewareCollection($middlewares, 'Request');
$middlewareCollection->run();
这样做是否正确呢?另外我也不明白在我的MiddlewareCollection类中,应该如何调用next()方法来调用下一个中间件。