Пользовательское промежуточное ПО Lumen в жизненном цикле консоли - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать промежуточное программное обеспечение для ведения журнала, когда мои команды выполняются.Регистратор работает, когда пользователь делает запрос 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 такой же, как я видел в документации, разве это не должно работать и на стороне консоли?

1 Ответ

0 голосов
/ 04 декабря 2018

Из-за природы метода terminate вы не можете использовать его в командах ремесленника, начиная с laravel docs :

Если вы определяете метод завершения в вашемпромежуточное ПО, оно будет автоматически вызываться после того, как ответ будет готов к отправке в браузер.

Это иллюстрирует поведение завершения и, поскольку он является индикатором состояния готовности ответа к отправкев браузер это не сделало бы, поскольку в случае консольной команды.

Также, если вы углубитесь в исходный код laravel, вы увидите, что оба ядра (http и ядро ​​консоли) обрабатывают жизненный цикл немного по-разному.на последнем этапе.Это правда, что у них одинаковый жизненный цикл в отношении метода handle, но при завершении они действуют по-разному:

Ядро консоли вызывает только $this->app->terminate();, что просто завершает работу всего приложения, тогда как ядро ​​http такжевыполняет $this->terminateMiddleware($request, $response); перед завершением вызова приложения.Таким образом, именно поэтому метод terminate не работает с консольными командами.

Так что для регистрации в конце команды вы должны просто поместить ее в конец функции handle.Или вы можете определить свою собственную функцию завершения, которую нужно вызывать вручную.

Надеюсь, это ответит на ваш вопрос.

...