* * This source file is subject to the GPL-3.0 license that is bundled * with this source code in the file LICENSE. */ namespace controllers\internals; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; /** * Class to analyse rules used by conditional groups. */ class Ruler extends \descartes\InternalController { private $expression_language; /** * Constructor. */ public function __construct() { $this->expression_language = new ExpressionLanguage(); //Add custom functions $this->expression_language->registerProvider(new ExpressionProvider()); } /** * Verify if a condition is valid. i.e we can evaluate it without error. * * @param string $condition : The condition to evaluate * @param array $data : The data to made available to condition * * @return bool : false if invalid, true else */ public function validate_condition(string $condition, array $data = []): bool { try { $this->expression_language->parse($condition, array_keys($data)); return true; } catch (\Exception $e) { return false; } catch (\Throwable $t) { //Just ignore non critical php warning and notice } } /** * Evaluate a condition. * * @param string $condition : The condition to evaluate * @param array $data : The data to made available to condition * * @return ?bool : false if invalid, true else, null only on error */ public function evaluate_condition(string $condition, array $data = []): ?bool { try { $result = $this->expression_language->evaluate($condition, $data); return (bool) $result; } catch (\Exception $e) { return null; } } }