【问题标题】:JavaScript Front End to PHP Rules EngineJavaScript 前端到 PHP 规则引擎
【发布时间】:2013-11-07 17:53:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript php design-patterns rule-engine rule


    【解决方案1】:

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

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

    【讨论】:

    【解决方案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)
        

        我希望它符合您的需求。

        【讨论】:

          猜你喜欢
          • 2011-07-13
          • 2011-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-23
          • 2017-11-10
          相关资源
          最近更新 更多