arch-8.x-1.x-dev/modules/shipping/src/ShippingMethodManager.php
modules/shipping/src/ShippingMethodManager.php
<?php namespace Drupal\arch_shipping; use Drupal\arch_order\Entity\OrderInterface; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Plugin\DefaultPluginManager; /** * Shipping method manager. * * @package Drupal\arch_shipping */ class ShippingMethodManager extends DefaultPluginManager implements ShippingMethodManagerInterface { /** * List of shipping methods. * * @var \Drupal\arch_shipping\ShippingMethodInterface[] */ protected $shippingMethods; /** * Constructs a ShippingMethodManager object. * * @param \Traversable $namespaces * An object that implements \Traversable which contains the root paths * keyed by the corresponding namespace to look for plugin implementations. * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend * Cache backend instance to use. * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler * The module handler to invoke the alter hook with. */ public function __construct( \Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, ) { parent::__construct( 'Plugin/ShippingMethod', $namespaces, $module_handler, 'Drupal\arch_shipping\ShippingMethodInterface', 'Drupal\arch_shipping\Annotation\ShippingMethod' ); $this->alterInfo('shipping_methods_plugin'); } /** * {@inheritdoc} */ public function getAllShippingMethods() { if (!isset($this->shippingMethods)) { $list = []; foreach ($this->getDefinitions() as $definition) { $method = $this->createInstance( $definition['id'], [] ); $list[$method->getPluginId()] = $method; } $this->shippingMethods = $list; } return $this->shippingMethods; } /** * {@inheritdoc} */ public function getShippingMethods() { return array_filter($this->getAllShippingMethods(), function ($method) { /** @var \Drupal\arch_shipping\ShippingMethodInterface $method */ return $method->isActive(); }); } /** * {@inheritdoc} */ public function getShippingMethod($id) { $this->getShippingMethods(); return $this->shippingMethods[$id] ?? NULL; } /** * {@inheritdoc} */ public function getAvailableShippingMethods(OrderInterface $order = NULL) { if (!$order) { return $this->getShippingMethods(); } return array_filter($this->getShippingMethods(), function ($method) use ($order) { /** @var \Drupal\arch_shipping\ShippingMethodInterface $method */ return $method->isAvailable($order); }); } /** * {@inheritdoc} */ public function getAvailableShippingMethodsForAddress($address) { return array_filter($this->getShippingMethods(), function ($method) use ($address) { /** @var \Drupal\arch_shipping\ShippingMethodInterface $method */ return $method->isAvailableForAddress($address); }); } /** * {@inheritdoc} */ public function getShippingPrices(OrderInterface $order) { $prices = []; foreach ($this->getAvailableShippingMethods($order) as $method) { $prices[$method->getPluginId()] = $method->getShippingPrice($order); } return $prices; } }