Przepisy

Jak wrzucić zdarzenie do wymiany?

Na początku aby wrzucić zdarzenie do wymiany musimy zdecydować, co w zdarzeniu ma się znajdować. Załóżmy, że chcemy wysłać zdarzenie, które poinformuje system o wysłaniu wiadomości, którą system zażądał wysłać.

<?php
  private function buildExchange(SystemMessage $message): Exchange {
              return BasicExchange::newInstance()
                ->setIn(BasicMessage::newInstance()
                      ->setBody(BasicEvent::newInstanceOf('message_sent')
                        ->withProperties([
                              'id' => $message->getId()
                        ])
                        ->withUser(new User([UserKeys::ID => $message->getAuthor()->getId()]))
                        ->withTime(time())));
      }
 ?>

Mamy już zdeklarowaną wymianę razem ze zdarzeniem, teraz musimy pchnąć ją do procesora, aby ten przesłał informację o tym do systemu.

<?php
    class SendEventToSystemProcessor implements Processor {
      public function process(Exchange $exchange) {
          $message = $exchange->getIn()->getBody();
          $this->sendMessage($message);
      }

      private function sendMessage(Message $message) {
        //Wysyłanie wiadomości do brokera.
      }
    }
 ?>

Ostatnim etapem jest utworzenie rurociągu, który przetworzy nasze działanie.

<?php
    class ModulePipelineFactory {
      /**
      * @var Exchange
      */
      private $exchange;

      public function create() {
        $this->exchange = $this->buildExchange($messageToSet);
        return $this->process();
      }

      private function process() {
        return Pipeline::start()
          ->add(new SendEventToSystemProcessor())
          ->process($this->exchange)
      }

      private function buildExchange(SystemMessage $message): Exchange {
              return BasicExchange::newInstance()
                ->setIn(BasicMessage::newInstance()
                      ->setBody(BasicEvent::newInstanceOf('message_sent')
                        ->withProperties([
                              'id' => $message->getId()
                        ])
                        ->withUser(new User([UserKeys::ID => $message->getAuthor()->getId()]))
                        ->withTime(time())));
      }
    }
 ?>

W taki sposób można zaimplementować wysyłanie zdarzeń, do zmiennej $messageToSet należy przypisać odpowiednie dane, które mogą być przekazane na przykład w klasie typu Provider.