vendor/sonata-project/notification-bundle/src/Backend/PostponeRuntimeBackend.php line 77

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the Sonata Project package.
  5.  *
  6.  * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Sonata\NotificationBundle\Backend;
  12. use Sonata\NotificationBundle\Iterator\IteratorProxyMessageIterator;
  13. use Sonata\NotificationBundle\Model\MessageInterface;
  14. use Symfony\Component\EventDispatcher\Event;
  15. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  16. use ZendDiagnostics\Result\Success;
  17. /**
  18.  * This backend postpones the handling of messages to a registered event.
  19.  *
  20.  * It's based on the asynchronous event dispatcher:
  21.  *
  22.  * @see https://gist.github.com/3852361
  23.  *
  24.  * @author Toni Uebernickel <tuebernickel@gmail.com>
  25.  */
  26. class PostponeRuntimeBackend extends RuntimeBackend
  27. {
  28.     /**
  29.      * @var MessageInterface[]
  30.      */
  31.     protected $messages = [];
  32.     /**
  33.      * If set to true, you have to fire an event the onEvent method is subscribed to manually!
  34.      *
  35.      * @var bool
  36.      */
  37.     protected $postponeOnCli false;
  38.     /**
  39.      * @param bool $postponeOnCli Whether to postpone the messages on the CLI, too
  40.      */
  41.     public function __construct(EventDispatcherInterface $dispatcher$postponeOnCli false)
  42.     {
  43.         parent::__construct($dispatcher);
  44.         $this->postponeOnCli $postponeOnCli;
  45.     }
  46.     /**
  47.      * {@inheritdoc}
  48.      */
  49.     public function publish(MessageInterface $message)
  50.     {
  51.         // if the message is generated from the cli the message is handled
  52.         // directly as there is no kernel.terminate in cli
  53.         if (!$this->postponeOnCli && $this->isCommandLineInterface()) {
  54.             $this->handle($message$this->dispatcher);
  55.             return;
  56.         }
  57.         $this->messages[] = $message;
  58.     }
  59.     /**
  60.      * Listen on any event and handle the messages.
  61.      *
  62.      * Actually, an event is not necessary, you can call this method manually, to.
  63.      * The event is not processed in any way.
  64.      */
  65.     public function onEvent(Event $event null)
  66.     {
  67.         while (!empty($this->messages)) {
  68.             $message array_shift($this->messages);
  69.             $this->handle($message$this->dispatcher);
  70.         }
  71.     }
  72.     /**
  73.      * {@inheritdoc}
  74.      */
  75.     public function getIterator()
  76.     {
  77.         return new IteratorProxyMessageIterator(new \ArrayIterator($this->messages));
  78.     }
  79.     /**
  80.      * {@inheritdoc}
  81.      */
  82.     public function getStatus()
  83.     {
  84.         return new Success('Postpone runtime backend''Ok (Postpone Runtime)');
  85.     }
  86.     /**
  87.      * Check whether this Backend is run on the CLI.
  88.      *
  89.      * @return bool
  90.      */
  91.     protected function isCommandLineInterface()
  92.     {
  93.         return 'cli' === \PHP_SAPI;
  94.     }
  95. }