vendor/crea/process-bundle/src/Provider/ProcessStepProvider.php line 23

Open in your IDE?
  1. <?php
  2. namespace Crea\ProcessBundle\Provider;
  3. use Crea\ProcessBundle\Model\AbstractProcessStep;
  4. use Crea\ProcessBundle\Model\ProcessStepInterface;
  5. use Crea\ProcessBundle\ProcessConfiguration\ProcessConfigurationSpecificValuesTrait;
  6. use RuntimeException;
  7. class ProcessStepProvider implements ProcessStepProviderInterface
  8. {
  9.     use ProcessConfigurationSpecificValuesTrait;
  10.     /** @var ProcessStepInterface[] */
  11.     private array $processStepServices;
  12.     /** @var ProcessStepInterface[] */
  13.     private array $processSteps = [];
  14.     public function __construct(iterable $processSteps,
  15.                                 iterable $processConfigurationSpecificProviders)
  16.     {
  17.         $this->processStepServices $processSteps instanceof \Traversable iterator_to_array($processSteps) : $processSteps;
  18.         $this->processConfigurationSpecificProviders $processConfigurationSpecificProviders instanceof \Traversable iterator_to_array($processConfigurationSpecificProviders) : $processConfigurationSpecificProviders;
  19.     }
  20.     public function getStep(string $indexstring $processTypestring $specificValue): ?ProcessStepInterface
  21.     {
  22.         $this->buildProcessSteps($this->processStepServices);
  23.         if (array_key_exists($index$this->processSteps)) {
  24.             //process type and specific value are defined
  25.             foreach ($this->processSteps[$index] as $processStep) {
  26.                 if ($processType === $processStep->getProcessType() && $specificValue === $processStep->getSpecificValue()) {
  27.                     return $processStep;
  28.                 }
  29.             }
  30.             //only process type is defined
  31.             foreach ($this->processSteps[$index] as $processStep) {
  32.                 if ($processType === $processStep->getProcessType() && null === $processStep->getSpecificValue()) {
  33.                     return $processStep;
  34.                 }
  35.             }
  36.             //only specific value is defined
  37.             foreach ($this->processSteps[$index] as $processStep) {
  38.                 if (null === $processStep->getProcessType() && $specificValue === $processStep->getSpecificValue()) {
  39.                     return $processStep;
  40.                 }
  41.             }
  42.             //process type and specific value are not defined
  43.             foreach ($this->processSteps[$index] as $processStep) {
  44.                 if (null === $processStep->getProcessType() && null === $processStep->getSpecificValue()) {
  45.                     return $processStep;
  46.                 }
  47.             }
  48.         }
  49.         return null;
  50.     }
  51.     public function getSteps(string $processTypestring $specificValue): array
  52.     {
  53.         $this->buildProcessSteps($this->processStepServices);
  54.         $steps = [];
  55.         foreach ($this->processSteps as $index => $processSteps) {
  56.             //process type and specific value are defined
  57.             foreach ($processSteps as $processStep) {
  58.                 if ($processType === $processStep->getProcessType() && $specificValue === $processStep->getSpecificValue()) {
  59.                     $steps[$index] = $processStep;
  60.                     break;
  61.                 }
  62.             }
  63.             //only process type is defined
  64.             foreach ($processSteps as $processStep) {
  65.                 if ($processType === $processStep->getProcessType() && null === $processStep->getSpecificValue()) {
  66.                     $steps[$index] = $processStep;
  67.                     break;
  68.                 }
  69.             }
  70.             //only specific value is defined
  71.             foreach ($processSteps as $processStep) {
  72.                 if (null === $processStep->getProcessType() && $specificValue === $processStep->getSpecificValue()) {
  73.                     $steps[$index] = $processStep;
  74.                     break;
  75.                 }
  76.             }
  77.             //process type and specific value are not defined
  78.             foreach ($processSteps as $processStep) {
  79.                 if (null === $processStep->getProcessType() && null === $processStep->getSpecificValue()) {
  80.                     $steps[$index] = $processStep;
  81.                     break;
  82.                 }
  83.             }
  84.         }
  85.         return $steps;
  86.     }
  87.     public function getStepsIndexes(): array
  88.     {
  89.         $this->buildProcessSteps($this->processStepServices);
  90.         $processStepsIndexes = [];
  91.         foreach ($this->processSteps as $index => $processStep) {
  92.             if (!in_array($index$processStepsIndexes)) {
  93.                 $processStepsIndexes[] = $index;
  94.             }
  95.         }
  96.         return $processStepsIndexes;
  97.     }
  98.     private function buildProcessSteps(array $processSteps): void
  99.     {
  100.         if (count($this->processSteps) === 0) {
  101.             //hydrate with AbstractProcessStep class
  102.             foreach ($processSteps as $processStep) {
  103.                 if (!$processStep instanceof AbstractProcessStep) {
  104.                     throw new RuntimeException(get_Class($processStep).' must implement abstract class "AbstractProcessStep"');
  105.                 }
  106.                 if (!array_key_exists($processStep->getIndex(), $this->processSteps)) {
  107.                     $this->processSteps[$processStep->getIndex()] = [];
  108.                 }
  109.                 $this->processSteps[$processStep->getIndex()][] = $processStep;
  110.             }
  111.             //check
  112.             $combinations = [];
  113.             $specificValues $this->getProcessConfigurationSpecificValues();
  114.             foreach ($this->processSteps as $processSteps) {
  115.                 foreach ($processSteps as $processStep) {
  116.                     //check specific values in process steps
  117.                     if ($processStep->getSpecificValue() !== null && !in_array($processStep->getSpecificValue(), $specificValues)) {
  118.                         throw new RuntimeException('Specific value "'.$processStep->getSpecificValue().'" does not exist in step class "'.get_class($processStep).'". Available values are : '.implode(", "$specificValues).'.');
  119.                     }
  120.                     //check duplicate combination of index, process type and specific value
  121.                     $combination $processStep->getIndex()."-".($processStep->getProcessType() !== null $processStep->getProcessType() : "")."-".($processStep->getSpecificValue() !== null $processStep->getSpecificValue() : "");
  122.                     if (!in_array($combination$combinations)) {
  123.                         $combinations[] = $combination;
  124.                     }
  125.                     else {
  126.                         throw new RuntimeException('Duplicate combination of index "'.$processStep->getIndex().'", process type "'.$processStep->getProcessType().'" and specific value "'.$processStep->getSpecificValue().'" in step class.');
  127.                     }
  128.                 }
  129.             }
  130.         }
  131.     }
  132. }