首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制台生命周期中的鲁门自定义中间件

控制台生命周期中的鲁门自定义中间件
EN

Stack Overflow用户
提问于 2018-11-30 16:54:24
回答 1查看 1.4K关注 0票数 1

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

有人能帮忙吗?

代码语言:javascript
运行
复制
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');
  }
}

我在这里把它登记在框架上:

代码语言:javascript
运行
复制
$app->middleware([
  App\Http\Middleware\LoggingMiddleware::class
]);

因此,如果控制台和Http请求的生命周期与我在文档中看到的相同,那么这难道不应该在控制台端也起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 11:29:08

由于terminate方法的性质,您不能在laravel 文档中的手工命令中使用它。

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

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

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53561771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档