【问题标题】:JavaScript Front End to PHP Rules EngineJavaScript 前端到 PHP 规则引擎
【发布时间】:2013-11-07 17:53:18
【问题描述】:
【问题讨论】:
标签:
javascript
php
design-patterns
rule-engine
rule
【解决方案2】:
我认为击球手方法是使用服务规则引擎并将其公开为服务。然后您的 javascript 应用程序可以简单地与服务通信、执行和操作规则。
这种方法的好处是您的规则执行不会发生在客户端上,您可以做一些有趣的事情,例如在不影响任何内容的情况下连接到数据库后端并将任务作为您的规则操作来运行。值得一提的是,并非所有规则都能够在客户端执行,因为不同类型的依赖关系:数据、服务、资源......所以在服务器端(在大多数情况下)运行它们是更可取的。最重要的是,在服务器上运行时,这些规则可以在多个客户端之间共享。
作为示例,您可以查看decision as a service sample 并查看通用 javascript 如何与服务器通信以执行。
【解决方案3】:
我们刚刚发布并积极支持名为 Gandalf 的项目,您可以在这里找到它:http://gandalf.nebo15.com。 Gandalf 由两个独立的项目组成:决策引擎后端和前端。
我看起来符合您的需求,但它是基于不同的库构建的。
对您的利弊:
- 您无需重新发明 GUI,也无需担心后端支持。
- 但您需要删除当前解决方案并通过 API 使用新解决方案。
【解决方案4】:
这是您已经完成的一个老问题,但今天(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)
我希望它符合您的需求。