/** * @author WN * @param DataSources $dataSources * @param Rule $rule * @return Value * @throws ProcessingException */ private function fetchValue(DataSources $dataSources, Rule $rule) { $source = $dataSources->getDataSource($rule->getSource()); if (!method_exists($source, $rule->getField())) { throw new ProcessingException('Field [' . $rule->getField() . '] not exists in source [' . $rule->getSource() . ']'); } $value = $source->{$rule->getField()}(); if (!$value instanceof Value) { throw new ProcessingException('Field [' . $rule->getField() . '] in source [' . $rule->getSource() . '] must be Value type'); } return $value; }
/** * @author WN * @param Rule $rule * @param Value $value * @param float $noMatchRisk * @return RuleAdvice */ public function process(Rule $rule, Value $value, $noMatchRisk = Risk::MAXIMUM_RISK) { $advice = RuleAdvice::make(['rule' => $rule, 'value' => $value, 'risk' => $noMatchRisk]); foreach ($rule->getConditions() as $condition) { try { if ($condition->checkCondition($value)) { $advice->setRisk($condition->getRisk()); $advice->setCondition($condition); break; } } catch (ProcessingException $e) { $advice->addExceptions('Processing condition [' . $condition->getValue() . ']: ' . $e->getMessage()); } } $advice->setMeta(['processor' => 'First match standard rule processor', 'no_match_risk' => $noMatchRisk]); return $advice; }