commerce_inventory-8.x-1.0-alpha6/src/QuantityMinimumManager.php

src/QuantityMinimumManager.php
<?php

namespace Drupal\commerce_inventory;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\DependencyInjection\ClassResolverInterface;

/**
 * Provides a manager for determining available quantity of Inventory Items.
 */
class QuantityMinimumManager implements QuantityManagerInterface {

  /**
   * The Commerce Inventory cache backend.
   *
   * @var \Drupal\Core\Cache\CacheBackendInterface
   */
  protected $cacheFactory;

  /**
   * The class resolver.
   *
   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
   */
  protected $classResolver;

  /**
   * An array of service ids.
   *
   * @var string[]
   */
  protected $serviceIds;

  /**
   * Constructs a new QuantityOnHandManager.
   *
   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_factory
   *   The Commerce Inventory cache backend.
   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
   *   The class resolver.
   * @param string[] $service_ids
   *   An array of service IDs in order.
   */
  public function __construct(CacheBackendInterface $cache_factory, ClassResolverInterface $class_resolver, array $service_ids) {
    $this->cacheFactory = $cache_factory;
    $this->classResolver = $class_resolver;
    $this->serviceIds = $service_ids;
  }

  /**
   * Resolves the Inventory Item's minimum quantity.
   *
   * @param int $inventory_item_id
   *   The Inventory Item entity ID.
   *
   * @return float|int|null
   *   The quantity.
   */
  protected function resolveQuantity($inventory_item_id) {
    // Run through each resolver to determine quantity.
    foreach ($this->serviceIds as $service_id) {
      /** @var \Drupal\commerce_inventory\QuantityMinimumResolverInterface $minimum_resolver */
      $minimum_resolver = $this->classResolver->getInstanceFromDefinition($service_id);
      $quantity = $minimum_resolver->resolve($inventory_item_id);

      // Return quantity if resolved.
      if (is_numeric($quantity)) {
        return $quantity;
      }
    }

    // Default to 0;.
    return 0;
  }

  /**
   * Gets an Inventory Item's quantity available.
   *
   * @param int $inventory_item_id
   *   The Inventory Item entity ID.
   *
   * @return float
   *   The quantity on-hand.
   */
  public function getQuantity($inventory_item_id) {
    $cid = InventoryHelper::generateQuantityCacheId($inventory_item_id, 'minimum');

    // Load on-hand quantity if valid.
    if ($cache = $this->cacheFactory->get($cid)) {
      $cache_data = $cache->data;
    }
    else {
      // Resolve quantity.
      $cache_data['quantity'] = $this->resolveQuantity($inventory_item_id);

      // Set cache tags.
      $cache_tags = InventoryHelper::generateQuantityCacheTags($inventory_item_id);
      $cache_tags = Cache::mergeTags($cache_tags, [$cid]);

      // Set cache.
      $this->cacheFactory->set($cid, $cache_data, Cache::PERMANENT, $cache_tags);
    }

    // Return quantity.
    return floatval($cache_data['quantity']);
  }

  /**
   * {@inheritdoc}
   */
  public function invalidateQuantity($inventory_item_id) {
    $cid = InventoryHelper::generateQuantityCacheId($inventory_item_id, 'minimum');
    $this->cacheFactory->invalidate($cid);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc