karboosx/procer

编写业务逻辑的自定义语言

0.5 2024-09-20 13:35 UTC

This package is auto-updated.

Last update: 2024-09-20 13:36:09 UTC


README

logo

Procer

Tests Documentation License Composer

Procer是一种简单轻量级语言,旨在以自然和易于阅读的方式描述流程和工作流。Procer的主要优势在于其功能可以暂停代码执行并等待信号以继续执行。

示例代码

let shopping_cart be new_shopping_cart(user_account).

let item be product_from_store("apple").

add(item) on shopping_cart.
on user_account do checkout.

此示例代码中的每个函数调用new_shopping_cartproduct_from_storeaddcheckout)实际上都是PHP世界中的一个函数。在这里,你只需编写业务逻辑,实现将由PHP完成。

查看Procer语法以获取更多信息。

安装

您可以使用composer安装Procer

composer require karboosx/procer

用法

use Karboosx\Procer;

$procer = new Karboosx\Procer();

$result = $procer->run('let a be 1.');

echo $result->get('a'); // 1

使用自定义函数

为了在Procer中使用自定义函数,您需要创建一个实现了FunctionProviderInterface接口的类,并将此类的实例传递给Karboosx\Procer构造函数。

use Karboosx\Procer;

$procer = new Karboosx\Procer([
   new CustomFunctionProvider()
]);

$result = $procer->run('let x be custom_function("hello world!").');

echo $result->get('x'); // "custom function result with argument: hello world!"

CustomFunctionProvider类应如下所示

class CustomFunctionProvider implements \Karboosx\Procer\FunctionProviderInterface
{
    public function custom_function(Context $context, array $arguments): string
    {
        return "custom function result with argument: {$arguments[0]}";
    }
    
    public function supports(string $functionName): bool
    {
        return in_array($functionName, ['custom_function']);
    }
}

注意:supports方法应返回true,如果提供者支持该函数,否则返回false

注意:custom_function方法应将Context对象作为第一个参数,将参数数组作为第二个参数。

Context对象包含在Procer代码中定义的变量。

查看自定义函数文档以获取更多信息。

评估表达式

如果您只想评估一个表达式,可以使用Karboosx\Procer类的runExpression方法。

use Karboosx\Procer;

$procer = new Procer();

$result = $procer->runExpression('1 + 2 * 3');

echo $result; // 7

查看表达式文档以获取更多信息。

暂停和恢复执行

您可以通过resume方法暂停Procer代码的执行并在以后恢复。

停止执行的好方法是使用等待信号语句。

use Karboosx\Procer;

$procer = new Procer();

$result = $procer->run(<<<CODE
let a be 1.
wait for signal test_signal.
let a be 2.
CODE);

echo $result->get('a'); // 1

$result = $procer->resume($context, [], ['test_signal']);

echo $result->get('a'); // 2

这样,您可以在脚本的一个点上暂停执行。等待用户输入或某些事件发生,然后恢复脚本执行。

查看信号文档以获取更多信息。
此外,查看序列化文档以获取有关如何序列化和反序列化脚本的更多信息。

文档

用户提交代码的安全性

只要提供的函数是安全的,用户提交的代码就安全运行。

Procer不允许运行任何PHP代码(除了提供的函数),不允许包含文件、写入文件、从文件读取、创建对象、使用eval或访问全局变量。

许可

此项目是开源软件,许可协议为MIT许可证。请参阅许可文件以获取更多信息。