vendor/symfony/messenger/DataCollector/MessengerDataCollector.php line 35

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Messenger\DataCollector;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\DataCollector\DataCollector;
  14. use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
  15. use Symfony\Component\Messenger\TraceableMessageBus;
  16. use Symfony\Component\VarDumper\Caster\ClassStub;
  17. /**
  18.  * @author Samuel Roze <samuel.roze@gmail.com>
  19.  *
  20.  * @final
  21.  */
  22. class MessengerDataCollector extends DataCollector implements LateDataCollectorInterface
  23. {
  24.     private array $traceableBuses = [];
  25.     public function registerBus(string $nameTraceableMessageBus $bus)
  26.     {
  27.         $this->traceableBuses[$name] = $bus;
  28.     }
  29.     public function collect(Request $requestResponse $response\Throwable $exception null)
  30.     {
  31.         // Noop. Everything is collected live by the traceable buses & cloned as late as possible.
  32.     }
  33.     public function lateCollect()
  34.     {
  35.         $this->data = ['messages' => [], 'buses' => array_keys($this->traceableBuses)];
  36.         $messages = [];
  37.         foreach ($this->traceableBuses as $busName => $bus) {
  38.             foreach ($bus->getDispatchedMessages() as $message) {
  39.                 $debugRepresentation $this->cloneVar($this->collectMessage($busName$message));
  40.                 $messages[] = [$debugRepresentation$message['callTime']];
  41.             }
  42.         }
  43.         // Order by call time
  44.         usort($messages, function ($a$b) { return $a[1] <=> $b[1]; });
  45.         // Keep the messages clones only
  46.         $this->data['messages'] = array_column($messages0);
  47.     }
  48.     public function getName(): string
  49.     {
  50.         return 'messenger';
  51.     }
  52.     public function reset()
  53.     {
  54.         $this->data = [];
  55.         foreach ($this->traceableBuses as $traceableBus) {
  56.             $traceableBus->reset();
  57.         }
  58.     }
  59.     protected function getCasters(): array
  60.     {
  61.         $casters parent::getCasters();
  62.         // Unset the default caster truncating collectors data.
  63.         unset($casters['*']);
  64.         return $casters;
  65.     }
  66.     private function collectMessage(string $busName, array $tracedMessage)
  67.     {
  68.         $message $tracedMessage['message'];
  69.         $debugRepresentation = [
  70.             'bus' => $busName,
  71.             'stamps' => $tracedMessage['stamps'] ?? null,
  72.             'stamps_after_dispatch' => $tracedMessage['stamps_after_dispatch'] ?? null,
  73.             'message' => [
  74.                 'type' => new ClassStub($message::class),
  75.                 'value' => $message,
  76.             ],
  77.             'caller' => $tracedMessage['caller'],
  78.         ];
  79.         if (isset($tracedMessage['exception'])) {
  80.             $exception $tracedMessage['exception'];
  81.             $debugRepresentation['exception'] = [
  82.                 'type' => $exception::class,
  83.                 'value' => $exception,
  84.             ];
  85.         }
  86.         return $debugRepresentation;
  87.     }
  88.     public function getExceptionsCount(string $bus null): int
  89.     {
  90.         $count 0;
  91.         foreach ($this->getMessages($bus) as $message) {
  92.             $count += (int) isset($message['exception']);
  93.         }
  94.         return $count;
  95.     }
  96.     public function getMessages(string $bus null): array
  97.     {
  98.         if (null === $bus) {
  99.             return $this->data['messages'];
  100.         }
  101.         return array_filter($this->data['messages'], function ($message) use ($bus) {
  102.             return $bus === $message['bus'];
  103.         });
  104.     }
  105.     public function getBuses(): array
  106.     {
  107.         return $this->data['buses'];
  108.     }
  109. }