commerce-8.x-2.8/modules/payment/src/PaymentGatewayStorage.php
modules/payment/src/PaymentGatewayStorage.php
<?php
namespace Drupal\commerce_payment;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_payment\Event\FilterPaymentGatewaysEvent;
use Drupal\commerce_payment\Event\PaymentEvents;
use Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\SupportsStoredPaymentMethodsInterface;
use Drupal\Component\Uuid\UuidInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\Entity\ConfigEntityStorage;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\user\UserInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* Defines the payment gateway storage.
*/
class PaymentGatewayStorage extends ConfigEntityStorage implements PaymentGatewayStorageInterface {
/**
* The event dispatcher.
*
* @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
*/
protected $eventDispatcher;
/**
* Constructs a PaymentGatewayStorage object.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory service.
* @param \Drupal\Component\Uuid\UuidInterface $uuid_service
* The UUID service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
* The event dispatcher.
*/
public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, UuidInterface $uuid_service, LanguageManagerInterface $language_manager, EventDispatcherInterface $event_dispatcher) {
parent::__construct($entity_type, $config_factory, $uuid_service, $language_manager);
$this->eventDispatcher = $event_dispatcher;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static(
$entity_type,
$container->get('config.factory'),
$container->get('uuid'),
$container->get('language_manager'),
$container->get('event_dispatcher')
);
}
/**
* {@inheritdoc}
*/
public function loadForUser(UserInterface $account) {
$payment_gateways = $this->loadByProperties(['status' => TRUE]);
$payment_gateways = array_filter($payment_gateways, function ($payment_gateway) {
return $payment_gateway->getPlugin() instanceof SupportsStoredPaymentMethodsInterface;
});
// @todo Implement resolving logic.
$payment_gateway = reset($payment_gateways);
return $payment_gateway;
}
/**
* {@inheritdoc}
*/
public function loadMultipleForOrder(OrderInterface $order) {
/** @var \Drupal\commerce_payment\Entity\PaymentGatewayInterface[] $payment_gateways */
$payment_gateways = $this->loadByProperties(['status' => TRUE]);
// Allow the list of payment gateways to be filtered via code.
$event = new FilterPaymentGatewaysEvent($payment_gateways, $order);
$this->eventDispatcher->dispatch(PaymentEvents::FILTER_PAYMENT_GATEWAYS, $event);
$payment_gateways = $event->getPaymentGateways();
// Evaluate conditions for the remaining ones.
foreach ($payment_gateways as $payment_gateway_id => $payment_gateway) {
if (!$payment_gateway->applies($order)) {
unset($payment_gateways[$payment_gateway_id]);
}
}
uasort($payment_gateways, [$this->entityType->getClass(), 'sort']);
return $payment_gateways;
}
}
