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

Posted

技术标签:

【中文标题】控制台生命周期中的 Lumen 自定义中间件【英文标题】:Lumen custom middleware in Console lifecycle 【发布时间】:2019-05-02 20:37:20 【问题描述】:

我正在尝试为我的命令运行创建一个日志中间件。 记录器在用户发出 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
]);

所以如果控制台和 Http 请求的生命周期与我在文档中看到的相同,那么这不应该在控制台端也能工作吗?

【问题讨论】:

还请分享您的代码,到目前为止您尝试了什么以及为什么这不起作用。参考:***.com/help/how-to-ask @SvenHakvoort 我真的只需要这些信息,因为我已经进行了很多搜索,并且文档提到 Http 和控制台生命周期是相同的,但我无法找到任何让它工作的地方。 我明白这一点,但为了了解这里可能出现的问题,代码是我们能够帮助您的强制性组件。我现在唯一知道的是您使用“记录器”,它可能是 php 中可用的许多不同选项之一,而且我完全不知道您如何调用日志记录函数。假设您使用标准流明记录器,它应该可以工作,但由于它不需要一些上下文来帮助您;) @SvenHakvoort 已经更新了它。感谢您的耐心。 【参考方案1】:

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

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

这说明了终止的行为,因为它是响应准备发送到浏览器的状态指示器,因为在控制台命令的情况下它不会做出。

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

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

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

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

【讨论】:

是的,确实有帮助;)再次感谢您

以上是关于控制台生命周期中的 Lumen 自定义中间件的主要内容,如果未能解决你的问题,请参考以下文章

在自定义模式解除转换后,第一个视图控制器的生命周期方法不会被调用

四大组件之Service生命周期

通过 Cloudformation 将配方分配给 Opsworks 中的生命周期事件

极品小程序中的自定义组件,以及页面的生命周期,应用的生命周期,以及tabber原始文件个个是做什么的

极品小程序中的自定义组件,以及页面的生命周期,应用的生命周期,以及tabber原始文件个个是做什么的

浅谈Vue的生命周期模型