控制台生命周期中的 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 自定义中间件的主要内容,如果未能解决你的问题,请参考以下文章
在自定义模式解除转换后,第一个视图控制器的生命周期方法不会被调用
通过 Cloudformation 将配方分配给 Opsworks 中的生命周期事件
极品小程序中的自定义组件,以及页面的生命周期,应用的生命周期,以及tabber原始文件个个是做什么的