我正在尝试为命令运行时创建日志记录中间件。 当用户发出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端工作?
答案 0 :(得分:0)
由于terminate
方法的性质,您不能在Laravel docs中的工匠命令中使用它:
如果您在中间件上定义了终止方法,它将 准备将响应发送到 浏览器。
这说明了终止的行为,并且由于它是用于准备将响应发送到浏览器的状态指示符,因此在使用控制台命令的情况下不会显示。
此外,如果您研究laravel源代码,您会发现两个内核(http和控制台内核)在最后一个阶段对生命周期的处理有些不同。的确,它们与handle
方法具有相同的生命周期,但是在终止时它们具有不同的行为:
控制台内核仅调用$this->app->terminate();
,这只会终止整个应用程序,而http内核也会在调用应用程序终止之前执行$this->terminateMiddleware($request, $response);
。因此,这就是为什么terminate方法不适用于控制台命令的原因。
因此,为了在命令末尾登录,您应该将其放在handle函数的末尾。或者,您可以定义自己的终止函数,该函数必须手动调用。
我希望这能回答您的问题。