vendor/symfony/messenger/Envelope.php line 21

Open in your IDE?
  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. use Symfony\Component\Messenger\Stamp\StampInterface;
  12. /**
  13.  * A message wrapped in an envelope with stamps (configurations, markers, ...).
  14.  *
  15.  * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
  16.  */
  17. final class Envelope
  18. {
  19.     /**
  20.      * @var array<string, list<StampInterface>>
  21.      */
  22.     private array $stamps = [];
  23.     private object $message;
  24.     /**
  25.      * @param object|Envelope  $message
  26.      * @param StampInterface[] $stamps
  27.      */
  28.     public function __construct(object $message, array $stamps = [])
  29.     {
  30.         $this->message $message;
  31.         foreach ($stamps as $stamp) {
  32.             $this->stamps[\get_class($stamp)][] = $stamp;
  33.         }
  34.     }
  35.     /**
  36.      * Makes sure the message is in an Envelope and adds the given stamps.
  37.      *
  38.      * @param StampInterface[] $stamps
  39.      */
  40.     public static function wrap(object $message, array $stamps = []): self
  41.     {
  42.         $envelope $message instanceof self $message : new self($message);
  43.         return $envelope->with(...$stamps);
  44.     }
  45.     /**
  46.      * Adds one or more stamps.
  47.      */
  48.     public function with(StampInterface ...$stamps): static
  49.     {
  50.         $cloned = clone $this;
  51.         foreach ($stamps as $stamp) {
  52.             $cloned->stamps[\get_class($stamp)][] = $stamp;
  53.         }
  54.         return $cloned;
  55.     }
  56.     /**
  57.      * Removes all stamps of the given class.
  58.      */
  59.     public function withoutAll(string $stampFqcn): static
  60.     {
  61.         $cloned = clone $this;
  62.         unset($cloned->stamps[$stampFqcn]);
  63.         return $cloned;
  64.     }
  65.     /**
  66.      * Removes all stamps that implement the given type.
  67.      */
  68.     public function withoutStampsOfType(string $type): self
  69.     {
  70.         $cloned = clone $this;
  71.         foreach ($cloned->stamps as $class => $stamps) {
  72.             if ($class === $type || is_subclass_of($class$type)) {
  73.                 unset($cloned->stamps[$class]);
  74.             }
  75.         }
  76.         return $cloned;
  77.     }
  78.     /**
  79.      * @template TStamp of StampInterface
  80.      *
  81.      * @param class-string<TStamp> $stampFqcn
  82.      *
  83.      * @return TStamp|null
  84.      */
  85.     public function last(string $stampFqcn): ?StampInterface
  86.     {
  87.         return isset($this->stamps[$stampFqcn]) ? end($this->stamps[$stampFqcn]) : null;
  88.     }
  89.     /**
  90.      * @return StampInterface[]|StampInterface[][] The stamps for the specified FQCN, or all stamps by their class name
  91.      */
  92.     public function all(string $stampFqcn null): array
  93.     {
  94.         if (null !== $stampFqcn) {
  95.             return $this->stamps[$stampFqcn] ?? [];
  96.         }
  97.         return $this->stamps;
  98.     }
  99.     public function getMessage(): object
  100.     {
  101.         return $this->message;
  102.     }
  103. }