0

我想做的是创建一个基于 Web 的规则引擎,用户可以在其中创建条件语句,将它们存储在数据库中,然后在数据集上执行它们。(例如,如果颜色等于绿色,则在描述中附加一些内容)

所以我在想的是使用 JavaScript 前端规则构建器(https://github.com/joshuamcginnis/rules-builder)在 JSON 中构建表达式,并将该命令表达式存储在 MongoDB 中。

现在,当需要执行这些规则时,它们会从数据库中提取,并通过 Ruler - 一个无状态 PHP 规则引擎 ( https://github.com/bobthecow/Ruler )构建和执行

所以对我来说缺少的部分是如何将 JSON 命令转换为 Ruler 理解的链式 PHP 命令?是否有解决此类问题的设计模式?

4

4 回答 4

1

所以这听起来你将不得不编写一个解析器(或解释器),它可以从 JSON 文件评估命令,如equalandequalOrGreaterThan或短语法=,并>=基于这些命令构建表达式。

看看这个链接http://www.slideshare.net/relaxnow/lets-build-a-parser,它会让你对我的意思有所了解。我希望我能引用它,但它是幻灯片。

于 2013-10-28T20:45:18.557 回答
0

我认为击球手方法是使用服务规则引擎并将其作为服务公开。然后您的 javascript 应用程序可以简单地与服务通信、执行和操作规则。

这种方法的好处是您的规则执行不会发生在客户端上,并且您可以做一些有趣的事情,例如在不影响任何内容的情况下连接到数据库后端并将任务作为您的规则操作来运行。值得一提的是,并非所有规则都能够在客户端执行,因为不同类型的依赖关系:数据、服务、资源......所以在服务器端(在大多数情况下)运行它们是更可取的。最重要的是,当在服务器上运行时,这些规则可以在多个客户端之间共享。

作为示例,您可以将决策作为服务样本进行检查,并查看通用 javascript 如何与服务器通信以供执行。

于 2015-05-20T06:00:24.420 回答
0

这是您已经完成的一个老问题,但是今天(2020 年 2 月)有一个很好的软件包可以完全解决您的问题。看看:https ://github.com/nicoSWD/php-rule-parser 。

你可以存储一个纯文本规则,然后使用这个包来解析它并执行它。它确实很酷,比如这个简单的语句:

$variables = ['foo' => 6];
$rule = new Rule('foo in [4, 6, 7]', $variables);
var_dump($rule->isTrue()); // bool(true)

或者这种方式更复杂的东西:

use nicoSWD\Rule;

$ruleStr = '
// This is true
2 < 3 && (
    // This is false
    foo in [4, 6, 7] ||
    // True
    [1, 4, 3].join("") === "143"
) && (
    // True
    "foo|bar|baz".split("|" /* uh oh */) === ["foo", /* what */ "bar", "baz"] &&
    // True
    bar > 6
)';

$rule = new Rule($ruleStr);
var_dump($rule->isTrue()); // bool(true)

我希望它符合您的需求。

于 2020-02-26T00:51:25.973 回答
0

我们刚刚发布并积极支持名为 Gandalf 的项目,您可以在这里找到它:http: //gandalf.nebo15.com。Gandalf 由两个独立的项目组成:决策引擎后端和前端。

我看起来是否符合您的需求,除了它建立在不同的库上。

对您的优点和缺点:

  • 您无需重新发明 GUI,也无需担心后端支持。
  • 但是您需要删除当前的解决方案并通过 API 使用新的解决方案。
于 2016-06-05T11:54:11.097 回答