commerce-8.x-2.8/modules/order/src/DependencyInjection/Compiler/PriceCalculatorPass.php
modules/order/src/DependencyInjection/Compiler/PriceCalculatorPass.php
<?php namespace Drupal\commerce_order\DependencyInjection\Compiler; use Drupal\commerce_order\OrderProcessorInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\DependencyInjection\Reference; /** * Adds order processors to the PriceCalculator, grouped by adjustment type. */ class PriceCalculatorPass implements CompilerPassInterface { /** * {@inheritdoc} */ public function process(ContainerBuilder $container) { $definition = $container->getDefinition('commerce_order.price_calculator'); $processor_interface = OrderProcessorInterface::class; $processors = []; foreach ($container->findTaggedServiceIds('commerce_order.order_processor') as $id => $attributes) { $processor = $container->getDefinition($id); if (!is_subclass_of($processor->getClass(), $processor_interface)) { throw new LogicException("Service '$id' does not implement $processor_interface."); } $attribute = $attributes[0]; if (empty($attribute['adjustment_type'])) { continue; } $processors[$id] = [ 'priority' => isset($attribute['priority']) ? $attribute['priority'] : 0, 'adjustment_type' => $attribute['adjustment_type'], ]; } // Sort the processors by priority. uasort($processors, function ($processor1, $processor2) { if ($processor1['priority'] == $processor2['priority']) { return 0; } return ($processor1['priority'] > $processor2['priority']) ? -1 : 1; }); // Add the processors to PriceCalculator. foreach ($processors as $id => $processor) { $arguments = [new Reference($id), $processor['adjustment_type']]; $definition->addMethodCall('addProcessor', $arguments); } } }