/** * {@inheritDoc} */ public function isEnabled() { if (null === $this->rule) { throw new FeatureException('No Rule has been set'); } if (null === $this->context) { $this->context = new Context(); } return $this->rule->evaluate($this->context); }
protected function executeSetRule($types, $discountPercent) { $contextOptions['true'] = true; $andOperators = []; $orOperators = []; $trueVar = new Variable('true'); foreach ($types as $type) { if (is_array($type)) { foreach ($type as $t) { $contextOptions['contains' . $t . 'Products'] = $this->containsProductWithType($t); $orOperators[] = new EqualTo(new Variable('contains' . $t . 'Products'), $trueVar); } $andOperators[] = new LogicalOr($orOperators); } else { $contextOptions['contains' . $type . 'Products'] = $this->containsProductWithType($type); $var = new Variable('contains' . $type . 'Products'); $andOperators[] = new EqualTo($var, $trueVar); } } $context = new Context($contextOptions); $rule = new Rule(new LogicalAnd($andOperators), function () use($types, $discountPercent) { $discount = 0; foreach ($types as $type) { if (!is_array($type)) { $extractTypes[] = $type; } } while (true) { $tuple = $this->extractProductsTuple($extractTypes); if (empty($tuple)) { break; } foreach ($tuple as $product) { $discount += $product['price'] * $discountPercent / 100; } } $this->discount += $discount; }); $rule->execute($context); }
/** * evaluateRule * * @param RankRule $rule * @param Context $ctx * @access private * @return void */ private function evaluateRule(RankRule $rule, Context $ctx) { $propositionClass = sprintf("Ruler\\Operator\\%s", ucfirst($rule->getComparator())); if (!class_exists($propositionClass)) { throw new \Exception("Class {$propositionClass} does not exist"); } // If fact is a date, we must convert value to unix timestamp // to do comparison if (preg_match('/date/i', $rule->getFact()->getName())) { $date = new \DateTime($rule->getValue()); $value = $date->getTimestamp(); } else { $value = $rule->getValue(); } $proposition = new $propositionClass(new Variable($rule->getFact()->getName()), new Variable('x' . $rule->getFact()->getName(), $value)); // add x value to context $myRule = new Rule($proposition, function () { }); if ($myRule->evaluate($ctx)) { if ($this->debug) { print "<h2>rule passed!</h2>"; } return true; } else { if ($this->debug) { print "<h2>rule failed</h2>"; } return false; } }
/** * @expectedException \LogicException */ public function testNonCallableActionsWillThrowAnException() { $context = new Context(); $rule = new Rule(new TrueProposition(), 'this is not callable'); $rule->execute($context); }