commerce-8.x-2.8/modules/payment/src/PaymentMethodStorage.php
modules/payment/src/PaymentMethodStorage.php
<?php
namespace Drupal\commerce_payment;
use Drupal\commerce\CommerceContentEntityStorage;
use Drupal\commerce_payment\Entity\PaymentGatewayInterface;
use Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\SupportsStoredPaymentMethodsInterface;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Entity\EntityStorageException;
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 method storage.
*/
class PaymentMethodStorage extends CommerceContentEntityStorage implements PaymentMethodStorageInterface {
/**
* The time.
*
* @var \Drupal\Component\Datetime\TimeInterface
*/
protected $time;
/**
* Constructs a new PaymentMethodStorage object.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Database\Connection $database
* The database connection to be used.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache
* The cache backend to be used.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
* The event dispatcher.
* @param \Drupal\Component\Datetime\TimeInterface $time
* The time.
*/
public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityManagerInterface $entity_manager, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, EventDispatcherInterface $event_dispatcher, TimeInterface $time) {
parent::__construct($entity_type, $database, $entity_manager, $cache, $language_manager, $event_dispatcher);
$this->time = $time;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static(
$entity_type,
$container->get('database'),
$container->get('entity.manager'),
$container->get('cache.entity'),
$container->get('language_manager'),
$container->get('event_dispatcher'),
$container->get('datetime.time')
);
}
/**
* {@inheritdoc}
*/
public function loadReusable(UserInterface $account, PaymentGatewayInterface $payment_gateway, array $billing_countries = []) {
// Anonymous users cannot have reusable payment methods.
if ($account->isAnonymous()) {
return [];
}
if (!($payment_gateway->getPlugin() instanceof SupportsStoredPaymentMethodsInterface)) {
return [];
}
$query = $this->getQuery();
$query
->condition('uid', $account->id())
->condition('payment_gateway', $payment_gateway->id())
->condition('payment_gateway_mode', $payment_gateway->getPlugin()->getMode())
->condition('reusable', TRUE)
->condition($query->orConditionGroup()
->condition('expires', $this->time->getRequestTime(), '>')
->condition('expires', 0))
->sort('method_id', 'DESC');
$result = $query->execute();
if (empty($result)) {
return [];
}
/** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface[] $payment_methods */
$payment_methods = $this->loadMultiple($result);
if (!empty($billing_countries)) {
// Filter out payment methods that don't match the billing countries.
// Payment methods without a billing profile should also be filtered out.
// @todo Use a query condition once #2822359 is fixed.
foreach ($payment_methods as $id => $payment_method) {
$country_code = 'ZZ';
if ($billing_profile = $payment_method->getBillingProfile()) {
$country_code = $billing_profile->address->first()->getCountryCode();
}
if (!in_array($country_code, $billing_countries)) {
unset($payment_methods[$id]);
}
}
}
return $payment_methods;
}
/**
* {@inheritdoc}
*/
protected function doCreate(array $values) {
if (!isset($values['payment_gateway'])) {
throw new EntityStorageException('Missing "payment_gateway" property when creating a payment method.');
}
return parent::doCreate($values);
}
}
