vendor/ezsystems/ezcommerce-shop/src/Silversolutions/Bundle/EshopBundle/Services/MessageInquiryService.php line 22

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. namespace Silversolutions\Bundle\EshopBundle\Services;
  7. use InvalidArgumentException;
  8. use Silversolutions\Bundle\EshopBundle\Exceptions\MessageInquiryException;
  9. use Silversolutions\Bundle\EshopBundle\Message\AbstractMessage;
  10. use Silversolutions\Bundle\EshopBundle\Message\Event\ErpMessageEvents;
  11. use Silversolutions\Bundle\EshopBundle\Message\Event\InquireMessageEvent;
  12. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. /**
  14.  * This class is intended to indirectly take care for the acquisition of
  15.  * message objects. To accomplish this, the class dispatches a special event
  16.  * that message listeners should register for, which are able to create the
  17.  * respective instances.
  18.  */
  19. class MessageInquiryService
  20. {
  21.     /**
  22.      * @var EventDispatcherInterface dependency.
  23.      */
  24.     protected $eventDispatcher;
  25.     /**
  26.      * @param EventDispatcherInterface $eventDispatcher
  27.      */
  28.     public function __construct(EventDispatcherInterface $eventDispatcher)
  29.     {
  30.         $this->eventDispatcher $eventDispatcher;
  31.     }
  32.     /**
  33.      * This method is called by clients of this service in order to obtain
  34.      * an instance of a specific message which's concrete class must not be
  35.      * known.
  36.      *
  37.      * The given $messageIdentifier is put into an event which several
  38.      * registered factories listen to. The factories themselves have to check
  39.      * whether they can instantiate the message. If a factory matched to a
  40.      * specific message type, it creates an instance and appends it to the
  41.      * event object.
  42.      *
  43.      * If a factory created a message object, it SHOULD call the
  44.      * stopPropagation() method of the given InquireMessageEvent. Otherwise
  45.      * another listener may overwrite the object.
  46.      *
  47.      * If a message could be created successfully, it is returned by this
  48.      * method.
  49.      *
  50.      * @param string $messageIdentifier
  51.      *
  52.      * @throws \InvalidArgumentException    If the $messageIdentifier is not a
  53.      *                                      valid string.
  54.      * @throws MessageInquiryException  If the message could not be created
  55.      *                                  properly
  56.      *
  57.      * @return AbstractMessage
  58.      */
  59.     public function inquireMessage($messageIdentifier)
  60.     {
  61.         if (!is_string($messageIdentifier) || empty($messageIdentifier)) {
  62.             throw new InvalidArgumentException(
  63.                     '$messageIdentifier must be non empty string.'
  64.             );
  65.         }
  66.         $event = new InquireMessageEvent($messageIdentifier);
  67.         $this->eventDispatcher->dispatch(
  68.                 $event,
  69.                 ErpMessageEvents::INQUIRE_MESSAGE
  70.         );
  71.         $messageObject $event->getMessage();
  72.         if (!($messageObject instanceof AbstractMessage)) {
  73.             if ($event->isPropagationStopped()) {
  74.                 $exceptionMessage 'A service was registered for the message identifier "'
  75.                         $messageIdentifier '" but the returned value is no AbstractMessage object.';
  76.             } else {
  77.                 $exceptionMessage 'The message object could not be determined. Probably no respective service '
  78.                         'was registered to the message identifier: "' $messageIdentifier '"';
  79.             }
  80.             throw new MessageInquiryException($exceptionMessage);
  81.         }
  82.         return $messageObject;
  83.     }
  84. }