vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SimpleEventDispatcher.php line 81

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of SwiftMailer.
  4.  * (c) 2004-2009 Chris Corbyn
  5.  *
  6.  * For the full copyright and license information, please view the LICENSE
  7.  * file that was distributed with this source code.
  8.  */
  9. /**
  10.  * The EventDispatcher which handles the event dispatching layer.
  11.  *
  12.  * @author Chris Corbyn
  13.  */
  14. class Swift_Events_SimpleEventDispatcher implements Swift_Events_EventDispatcher
  15. {
  16.     /** A map of event types to their associated listener types */
  17.     private $eventMap = [];
  18.     /** Event listeners bound to this dispatcher */
  19.     private $listeners = [];
  20.     /**
  21.      * Create a new EventDispatcher.
  22.      */
  23.     public function __construct()
  24.     {
  25.         $this->eventMap = [
  26.             'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener',
  27.             'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener',
  28.             'Swift_Events_SendEvent' => 'Swift_Events_SendListener',
  29.             'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener',
  30.             'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener',
  31.             ];
  32.     }
  33.     /**
  34.      * Create a new SendEvent for $source and $message.
  35.      *
  36.      * @return Swift_Events_SendEvent
  37.      */
  38.     public function createSendEvent(Swift_Transport $sourceSwift_Mime_SimpleMessage $message)
  39.     {
  40.         return new Swift_Events_SendEvent($source$message);
  41.     }
  42.     /**
  43.      * Create a new CommandEvent for $source and $command.
  44.      *
  45.      * @param string $command      That will be executed
  46.      * @param array  $successCodes That are needed
  47.      *
  48.      * @return Swift_Events_CommandEvent
  49.      */
  50.     public function createCommandEvent(Swift_Transport $source$command$successCodes = [])
  51.     {
  52.         return new Swift_Events_CommandEvent($source$command$successCodes);
  53.     }
  54.     /**
  55.      * Create a new ResponseEvent for $source and $response.
  56.      *
  57.      * @param string $response
  58.      * @param bool   $valid    If the response is valid
  59.      *
  60.      * @return Swift_Events_ResponseEvent
  61.      */
  62.     public function createResponseEvent(Swift_Transport $source$response$valid)
  63.     {
  64.         return new Swift_Events_ResponseEvent($source$response$valid);
  65.     }
  66.     /**
  67.      * Create a new TransportChangeEvent for $source.
  68.      *
  69.      * @return Swift_Events_TransportChangeEvent
  70.      */
  71.     public function createTransportChangeEvent(Swift_Transport $source)
  72.     {
  73.         return new Swift_Events_TransportChangeEvent($source);
  74.     }
  75.     /**
  76.      * Create a new TransportExceptionEvent for $source.
  77.      *
  78.      * @return Swift_Events_TransportExceptionEvent
  79.      */
  80.     public function createTransportExceptionEvent(Swift_Transport $sourceSwift_TransportException $ex)
  81.     {
  82.         return new Swift_Events_TransportExceptionEvent($source$ex);
  83.     }
  84.     /**
  85.      * Bind an event listener to this dispatcher.
  86.      */
  87.     public function bindEventListener(Swift_Events_EventListener $listener)
  88.     {
  89.         foreach ($this->listeners as $l) {
  90.             // Already loaded
  91.             if ($l === $listener) {
  92.                 return;
  93.             }
  94.         }
  95.         $this->listeners[] = $listener;
  96.     }
  97.     /**
  98.      * Dispatch the given Event to all suitable listeners.
  99.      *
  100.      * @param string $target method
  101.      */
  102.     public function dispatchEvent(Swift_Events_EventObject $evt$target)
  103.     {
  104.         $bubbleQueue $this->prepareBubbleQueue($evt);
  105.         $this->bubble($bubbleQueue$evt$target);
  106.     }
  107.     /** Queue listeners on a stack ready for $evt to be bubbled up it */
  108.     private function prepareBubbleQueue(Swift_Events_EventObject $evt)
  109.     {
  110.         $bubbleQueue = [];
  111.         $evtClass = \get_class($evt);
  112.         foreach ($this->listeners as $listener) {
  113.             if (\array_key_exists($evtClass$this->eventMap)
  114.                 && ($listener instanceof $this->eventMap[$evtClass])) {
  115.                 $bubbleQueue[] = $listener;
  116.             }
  117.         }
  118.         return $bubbleQueue;
  119.     }
  120.     /** Bubble $evt up the stack calling $target() on each listener */
  121.     private function bubble(array &$bubbleQueueSwift_Events_EventObject $evt$target)
  122.     {
  123.         if (!$evt->bubbleCancelled() && $listener array_shift($bubbleQueue)) {
  124.             $listener->$target($evt);
  125.             $this->bubble($bubbleQueue$evt$target);
  126.         }
  127.     }
  128. }