vendor/symfony/messenger/TraceableMessageBus.php line 38

  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;
  11. /**
  12.  * @author Samuel Roze <samuel.roze@gmail.com>
  13.  */
  14. class TraceableMessageBus implements MessageBusInterface
  15. {
  16.     private MessageBusInterface $decoratedBus;
  17.     private array $dispatchedMessages = [];
  18.     public function __construct(MessageBusInterface $decoratedBus)
  19.     {
  20.         $this->decoratedBus $decoratedBus;
  21.     }
  22.     public function dispatch(object $message, array $stamps = []): Envelope
  23.     {
  24.         $envelope Envelope::wrap($message$stamps);
  25.         $context = [
  26.             'stamps' => array_merge([], ...array_values($envelope->all())),
  27.             'message' => $envelope->getMessage(),
  28.             'caller' => $this->getCaller(),
  29.             'callTime' => microtime(true),
  30.         ];
  31.         try {
  32.             return $envelope $this->decoratedBus->dispatch($message$stamps);
  33.         } catch (\Throwable $e) {
  34.             $context['exception'] = $e;
  35.             throw $e;
  36.         } finally {
  37.             $this->dispatchedMessages[] = $context + ['stamps_after_dispatch' => array_merge([], ...array_values($envelope->all()))];
  38.         }
  39.     }
  40.     public function getDispatchedMessages(): array
  41.     {
  42.         return $this->dispatchedMessages;
  43.     }
  44.     public function reset()
  45.     {
  46.         $this->dispatchedMessages = [];
  47.     }
  48.     private function getCaller(): array
  49.     {
  50.         $trace debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS8);
  51.         $file $trace[1]['file'] ?? null;
  52.         $line $trace[1]['line'] ?? null;
  53.         $handleTraitFile = (new \ReflectionClass(HandleTrait::class))->getFileName();
  54.         $found false;
  55.         for ($i 1$i 8; ++$i) {
  56.             if (isset($trace[$i]['file'], $trace[$i 1]['file'], $trace[$i 1]['line']) && $trace[$i]['file'] === $handleTraitFile) {
  57.                 $file $trace[$i 1]['file'];
  58.                 $line $trace[$i 1]['line'];
  59.                 $found true;
  60.                 break;
  61.             }
  62.         }
  63.         for ($i 2$i && !$found; ++$i) {
  64.             if (isset($trace[$i]['class'], $trace[$i]['function'])
  65.                 && 'dispatch' === $trace[$i]['function']
  66.                 && is_a($trace[$i]['class'], MessageBusInterface::class, true)
  67.             ) {
  68.                 $file $trace[$i]['file'];
  69.                 $line $trace[$i]['line'];
  70.                 while (++$i 8) {
  71.                     if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && !str_starts_with($trace[$i]['function'], 'call_user_func')) {
  72.                         $file $trace[$i]['file'];
  73.                         $line $trace[$i]['line'];
  74.                         break;
  75.                     }
  76.                 }
  77.                 break;
  78.             }
  79.         }
  80.         $name str_replace('\\''/', (string) $file);
  81.         return [
  82.             'name' => substr($namestrrpos($name'/') + 1),
  83.             'file' => $file,
  84.             'line' => $line,
  85.         ];
  86.     }
  87. }