控制台生命周期中的Lumen自定义中间件

时间:2018-11-30 16:54:24

标签: laravel console kernel middleware lumen

我正在尝试为命令运行时创建日志记录中间件。 当用户发出HTTP请求时,记录器正在工作,但是当调度命令被调用时,我不知道如何使它工作。

有人可以帮忙吗?

class LoggingMiddleware {

  /**
   * Handle an incoming request.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  \Closure  $next
   * @return mixed
   */
  public function handle($request, Closure $next) {
    return $next($request);
  }

  /**
   * Perform any final actions for the request lifecycle.
   *
   * @param  Request  $request
   * @param  Response  $response
   * @return void
   */
  public function terminate($request, $response) {
    dd('HELLOWORLD');
  }
}

我在这里在框架上注册它:

$app->middleware([
  App\Http\Middleware\LoggingMiddleware::class
]);

因此,如果Console和Http请求的生命周期与我在文档中看到的相同,那么是否也不能在Console端工作?

1 个答案:

答案 0 :(得分:0)

由于terminate方法的性质,您不能在Laravel docs中的工匠命令中使用它:

  

如果您在中间件上定义了终止方法,它将   准备将响应发送到   浏览器。

这说明了终止的行为,并且由于它是用于准备将响应发送到浏览器的状态指示符,因此在使用控制台命令的情况下不会显示。

此外,如果您研究laravel源代码,您会发现两个内核(http和控制台内核)在最后一个阶段对生命周期的处理有些不同。的确,它们与handle方法具有相同的生命周期,但是在终止时它们具有不同的行为:

控制台内核仅调用$this->app->terminate();,这只会终止整个应用程序,而http内核也会在调用应用程序终止之前执行$this->terminateMiddleware($request, $response);。因此,这就是为什么terminate方法不适用于控制台命令的原因。

因此,为了在命令末尾登录,您应该将其放在handle函数的末尾。或者,您可以定义自己的终止函数,该函数必须手动调用。

我希望这能回答您的问题。