【发布时间】:2016-02-13 03:03:57
【问题描述】:
我试图了解中间件在 Laravel 5 中是如何工作的。我查看了中间件接口并明白我必须实现一个类,该类有一个名为“handle”的方法。在“handle”方法中,调用闭包。但我不明白,关闭时应该通过什么。什么类会调用我的中间件?它是如何在引擎盖下工作的?可能就像“foreach”一样,所有中间件都会被轮流调用? 更新: 我正在尝试实现自己的中间件:
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() 方法中调用下一个中间件。
【问题讨论】:
-
中间件,以前称为过滤器,由 MiddlewareServiceProvider 处理,它们的逻辑在路由访问时执行,在请求接收之后和请求注入到路由器之前的“中间”某处。
-
我认为@TheMrbikus 了解中间件的工作流程,但他想了解的是闭包 $next 是在哪里编写和调用的。他向你展示了handle方法如何调用+闭包的逻辑,我想没有人理解他的问题。
-
@Dannyhax 是的,你说得对,兄弟! :) 事实上我已经写了我的中间件调度器。如果你感兴趣github.com/SmirnovW/light-middleware-dispatcher
标签: php laravel middleware