我正在尝试为命令运行时创建一个日志记录中间件。当用户发出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请求的生命周期与我在文档中看到的相同,那么这难道不应该在控制台端也起作用吗?
发布于 2018-12-04 11:29:08
由于terminate方法的性质,您不能在laravel 文档中的手工命令中使用它。
如果在中间件上定义了终止方法,它将在响应准备发送到浏览器后自动调用。
这说明了终止的行为,因为它是准备发送到浏览器的响应的状态指示符,所以在控制台命令的情况下不会这样做。
此外,如果深入研究laravel源代码,您将看到两个内核(http和控制台内核)在最后一个阶段处理生命周期的方式略有不同。的确,对于handle方法,它们具有相同的生命周期,但在终止时它们有不同的行为:
控制台内核只调用只终止整个应用程序的$this->app->terminate();,而http内核也在调用应用程序终止之前执行$this->terminateMiddleware($request, $response);。因此,这就是为什么终止方法不能在控制台命令上工作的原因。
因此,为了在命令末尾登录,只需将其放在handle函数的末尾即可。或者您可以定义自己的终止函数,该函数必须手动调用。
我希望这能回答你的问题。
https://stackoverflow.com/questions/53561771
复制相似问题