Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP规则引擎的JavaScript前端_Javascript_Php_Design Patterns_Rule Engine_Rule - Fatal编程技术网

PHP规则引擎的JavaScript前端

PHP规则引擎的JavaScript前端,javascript,php,design-patterns,rule-engine,rule,Javascript,Php,Design Patterns,Rule Engine,Rule,我想做的是创建一个基于Web的规则引擎,用户可以在其中创建条件语句,将它们存储在数据库中,然后在数据集上执行它们。(例如,如果颜色等于绿色,则在描述中添加一些内容) 所以我的想法是使用JavaScript前端规则生成器()以JSON构建一个表达式,并将该命令表达式存储在MongoDB中 现在,当这些规则需要执行时,它们会从数据库中提取出来,并通过Ruler(一个无状态PHP规则引擎()构建和执行 因此,我缺少的是如何将JSON命令转换为Ruler能够理解的链接PHP命令?有没有一种设计模式可以解

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

所以我的想法是使用JavaScript前端规则生成器()以JSON构建一个表达式,并将该命令表达式存储在MongoDB中

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


因此,我缺少的是如何将JSON命令转换为Ruler能够理解的链接PHP命令?有没有一种设计模式可以解决类似的问题?

所以听起来你需要编写一个解析器(或解释器),一种可以从JSON文件中计算命令(如
equal
equalOrCreateThan
或short synax
=
=
),并基于这些命令构建表达式的工具


看看这个链接,它会让你了解我的意思。我希望我能引用它,但这是一个幻灯片放映。

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

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


例如,您可以检查并查看通用javascript如何与服务器通信以执行。

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

我看起来很适合你的需要,只是它是建立在不同的库上的

对你的利弊:

  • 您不需要重新发明GUI,也不需要担心后端支持
  • 但您需要删除当前的解决方案,并通过API使用新的解决方案

这是一个你已经做过的老问题,但今天(2020年2月)有一个很好的软件包,可以精确地处理你的问题。 请查看:

您可以存储一条纯文本规则,然后使用此包解析并执行它。 它确实很酷,比如下面这个简单的声明:

$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)
使用nicoSWD\Rule;
$ruleStr='1〕
//这是真的
2 < 3 && (
//这是假的
foo-in[4,6,7]||
//真的
[1,4,3]。连接(“”=“143”
) && (
//真的
“foo | bar | baz”.split(“|”/*uh-oh*/)===[“foo”、/*what*/“bar”、“baz”]&&
//真的
巴>6
)';
$rule=新规则($ruleStr);
变量转储($rule->isTrue());//布尔(真)

我希望它能满足您的需要。

我发现这个库包含一个解析器并支持“英语”规则。