custom/plugins/SwagAmazonPay/src/Storefront/EventListeners/AmazonPayAvailabilityListener.php line 37

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Swag\AmazonPay\Storefront\EventListeners;
  3. use Psr\Log\LoggerInterface;
  4. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  5. use Shopware\Core\System\SalesChannel\Entity\SalesChannelEntitySearchResultLoadedEvent;
  6. use Swag\AmazonPay\Components\Config\ConfigServiceInterface;
  7. use Swag\AmazonPay\Components\Config\Validation\Exception\ConfigValidationException;
  8. use Swag\AmazonPay\Installer\PaymentMethodInstaller;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class AmazonPayAvailabilityListener implements EventSubscriberInterface
  11. {
  12.     private ConfigServiceInterface $configService;
  13.     private LoggerInterface $logger;
  14.     public function __construct(
  15.         ConfigServiceInterface $configService,
  16.         LoggerInterface $logger
  17.     ) {
  18.         $this->configService $configService;
  19.         $this->logger $logger;
  20.     }
  21.     /**
  22.      * {@inheritdoc}
  23.      */
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             'sales_channel.payment_method.search.result.loaded' => ['onSalesChannelSearchResultLoaded', -1],
  28.         ];
  29.     }
  30.     public function onSalesChannelSearchResultLoaded(SalesChannelEntitySearchResultLoadedEvent $event): void
  31.     {
  32.         try {
  33.             $config $this->configService->getPluginConfig($event->getSalesChannelContext()->getSalesChannel()->getId());
  34.         } catch (ConfigValidationException $e) {
  35.             $this->logger->error('Invalid plugin configuration', ['field' => $e->getField()]);
  36.             $this->removeSwagAmazonPayPaymentMethod($event);
  37.             return;
  38.         }
  39.         if ($event->getSalesChannelContext()->getSalesChannel()->getPaymentMethodId() === PaymentMethodInstaller::AMAZON_PAYMENT_ID) {
  40.             return;
  41.         }
  42.         if ($config->hideOneClickCheckoutButtons() === true) {
  43.             $this->removeSwagAmazonPayPaymentMethod($event);
  44.         }
  45.     }
  46.     private function removeSwagAmazonPayPaymentMethod(SalesChannelEntitySearchResultLoadedEvent $event): void
  47.     {
  48.         $filter = static function (PaymentMethodEntity $entity): bool {
  49.             return $entity->getId() !== PaymentMethodInstaller::AMAZON_PAYMENT_ID;
  50.         };
  51.         $filteredPaymentMethods $event->getResult()->getEntities()->filter($filter);
  52.         $event->getResult()->assign([
  53.             'total' => \count($filteredPaymentMethods),
  54.             'entities' => $filteredPaymentMethods,
  55.             'elements' => $filteredPaymentMethods->getElements(),
  56.         ]);
  57.     }
  58. }