custom/plugins/WbfkExtensions/src/Subscriber/SendNotificationMailOnConsoleErrors.php line 27

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace WbfkExtensions\Subscriber;
  4. use Symfony\Component\Console\Event\ConsoleErrorEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use WbfkExtensions\Service\AdminMailService;
  7. class SendNotificationMailOnConsoleErrors implements EventSubscriberInterface
  8. {
  9.     public function __construct(
  10.         private readonly AdminMailService $adminMailService,
  11.         private readonly array $commandsRequiringEmailOnError
  12.     ) {
  13.     }
  14.     public static function getSubscribedEvents(): array
  15.     {
  16.         return [
  17.             ConsoleErrorEvent::class => 'onConsoleError'
  18.         ];
  19.     }
  20.     public function onConsoleError(ConsoleErrorEvent $event): void
  21.     {
  22.         // If command is not in notification's list then no mailing required
  23.         if (!in_array($event->getCommand()?->getName(), $this->commandsRequiringEmailOnError)) {
  24.             return;
  25.         }
  26.         // Send error mail
  27.         $this->adminMailService->send(
  28.             'Failed command: ' $event->getCommand()?->getName(),
  29.             $this->createPlainContent($event),
  30.             $this->createHtmlContent($event)
  31.         );
  32.     }
  33.     private function createPlainContent(ConsoleErrorEvent $event): string
  34.     {
  35.         $returnString "Command failed: " $event->getCommand()?->getName() . "\n\r";
  36.         if (count($event->getInput()->getArguments()) > 1) {
  37.             $arguments $event->getInput()->getArguments();
  38.             array_shift($arguments);
  39.             $returnString .= "Command arguments: " implode(' '$event->getInput()->getArguments()) . "\n\r";
  40.         }
  41.         $returnString .= "Exit code: " $event->getExitCode() . "\n\r";
  42.         $returnString .= "Error output: " $event->getError()->getMessage() . "\n\r";
  43.         $returnString .= "Stack trace:\n\r" $event->getError()->getTraceAsString() . "\n\r";
  44.         return $returnString;
  45.     }
  46.     private function createHtmlContent(ConsoleErrorEvent $event): string
  47.     {
  48.         $returnString '<p>Command failed: <b>' $event->getCommand()?->getName() . '</b></p>';
  49.         if (count($event->getInput()->getArguments()) > 1) {
  50.             $arguments $event->getInput()->getArguments();
  51.             array_shift($arguments);
  52.             $returnString .= '<p>Command arguments: <b>' implode(' '$event->getInput()->getArguments()) . '</b></p>';
  53.         }
  54.         $returnString .= '<p>Exit code: <b>' $event->getExitCode() . '</b></p>';
  55.         $returnString .= '<p>Error output: <b>' $event->getError()->getMessage() . '</b></p>';
  56.         $returnString .= '<p>Stack trace:<br/><pre>' $event->getError()->getTraceAsString() . '</pre></p>';
  57.         return $returnString;
  58.     }
  59. }