src/Component/Console/Listener/ConsoleEventListener.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Component\Console\Listener;
  3. use App\Component\Console\Output\ConsoleLogOutput;
  4. use App\Component\Traits\Service\EmailerServiceTrait;
  5. use Symfony\Component\Console\Event\ConsoleCommandEvent;
  6. use Symfony\Component\Console\Event\ConsoleErrorEvent;
  7. use Symfony\Component\Console\Event\ConsoleTerminateEvent;
  8. use Symfony\Component\Console\Input\ArgvInput;
  9. use Symfony\Component\Console\Input\InputArgument;
  10. use Symfony\Component\Filesystem\Filesystem;
  11. use Symfony\Component\HttpKernel\KernelInterface;
  12. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  13. class ConsoleEventListener
  14. {
  15. use EmailerServiceTrait;
  16. protected $kernel;
  17. public function __construct(KernelInterface $kernel)
  18. {
  19. $this->kernel = $kernel;
  20. }
  21. /**
  22. * @param ConsoleCommandEvent $event
  23. * @throws \Exception
  24. */
  25. public function onConsoleCommand(ConsoleCommandEvent $event)
  26. {
  27. /** @var ArgvInput $input */
  28. $input = $event->getInput();
  29. $event->getOutput()->writeln('START ' . $this->getDisplayedName($input));
  30. /** @var ConsoleLogOutput $output */
  31. $output = $event->getOutput();
  32. set_error_handler(function ($errno, $errstr, $errfile, $errline/*, $errContext*/) use ($output) {
  33. $file = $this->getRelativePath($errfile);
  34. $message = $errstr . ' in ' . $file . ':' . $errline;
  35. $trace = (new \Exception)->getTraceAsString();
  36. // Remove first item from backtrace as it's this function which is redundant.
  37. $trace = preg_replace('/^#0.+' . 'ConsoleEventListener' . "[^\n]*\n/", '', $trace, 1);
  38. switch ($errno) {
  39. case E_WARNING:
  40. case E_USER_WARNING:
  41. $output->addWarning($message, $trace, $errno);
  42. break;
  43. case E_NOTICE:
  44. case E_USER_NOTICE:
  45. $output->addNotice($message, $trace, $errno);
  46. break;
  47. case E_DEPRECATED:
  48. case E_USER_DEPRECATED:
  49. // pas de log des "deprecated"
  50. return true;
  51. default:
  52. $output->addError($message, $trace, $errno);
  53. }
  54. return true;
  55. });
  56. }
  57. /**
  58. * @param ConsoleTerminateEvent $event
  59. * @throws \Exception
  60. * @throws TransportExceptionInterface
  61. */
  62. public function onConsoleTerminate(ConsoleTerminateEvent $event)
  63. {
  64. /** @var ArgvInput $input */
  65. $input = $event->getInput();
  66. $event->getOutput()->writeln('END ' . $this->getDisplayedName($input));
  67. if (method_exists($event->getOutput(), 'getErrors') && !empty($event->getOutput()->getErrors())) {
  68. $this->emailerService
  69. ->setTo($this->kernel->getContainer()->getParameter('app.default_recipient'))
  70. ->setSubject('Erreur de CRON (' . $event->getCommand()->getName() . ')')
  71. ->setTemplate('email/console-error.html.twig')
  72. ->setParameters([
  73. 'cron' => $this->getDisplayedName($input),
  74. 'date' => new \DateTime(),
  75. 'erreurs' => $event->getOutput()->getErrors(),
  76. ])
  77. ->send();
  78. }
  79. // // On supprime le fichier si rien n'est loggé
  80. // $a = $event->getCommand()->getApplication();
  81. // if ($a instanceof ConsoleApplication) {
  82. // $f = $a->logFile;
  83. // $c = file_get_contents($f);
  84. // $l = substr_count($c, "\n");
  85. // if ($l === 2) {
  86. // (new Filesystem())->remove($f);
  87. // }
  88. // }
  89. }
  90. /**
  91. * @param ConsoleErrorEvent $event
  92. */
  93. public function onConsoleError(ConsoleErrorEvent $event)
  94. {
  95. $error = $event->getError();
  96. /** @var ConsoleLogOutput $output */
  97. $output = $event->getOutput();
  98. $output->addError($error->getMessage(), $error->getTraceAsString(), $error->getCode());
  99. }
  100. /**
  101. * @param ArgvInput|InputArgument $input
  102. * @return string
  103. */
  104. protected function getDisplayedName($input)
  105. {
  106. $args = $input->__toString();
  107. return trim(str_replace('"', '', $args));
  108. }
  109. /**
  110. * @param string $file
  111. * @return string
  112. */
  113. protected function getRelativePath($file)
  114. {
  115. $filesystem = new Filesystem();
  116. return $filesystem->makePathRelative(dirname($file), $this->kernel->getProjectDir()) . basename($file);
  117. }
  118. }