phpflo/phpflo-fbp

php的fbp实现

v1.2.0 2017-03-26 20:41 UTC

This package is auto-updated.

Last update: 2024-08-24 04:00:24 UTC


README

基于流的编程协议(FBP)配置文件加载器,使用FBP领域特定语言(DSL)。

Build Status Scrutinizer Code Quality Code Coverage License

简介

这个库允许您加载和解析您的phpflo项目的配置。如果您想将旧的JSON配置转换为FBP规范,它也可以独立运行。支持的配置格式是JSON(.json)、YAML(.yml)和FBP(.fbp),输出是类型为FbpDefinition的对象。这允许您以不同的格式输出解析内容,从数组、FBP、JSON到YAML。

代码示例

基本用法

// load FBP config
$defintiion = PhpFlo\Loader\Loader::load('my/fbp/config/file.fbp');

您可以这样加载JSON、YAML和FBP。

解析器本身

$myFbpConfig = <<<EOF
# Read a file and cout its lines
'test.file' -> IN ReadFile(ReadFile)
ReadFile(ReadFile) OUT -> IN SplitbyLines(SplitStr)
ReadFile() ERROR -> IN Display(Output)
SplitbyLines() OUT -> IN CountLines(Counter)
CountLines() COUNT -> IN Display()
EOF;

$parser = new PhpFlo\Fbp\FbpParser();
$definition = $parser->run($myFbpConfig);

将您的流程输出为某种格式

$json = PhpFlo\Fbp\FbpDumper::toJson($definition);
$yaml = PhpFlo\Fbp\FbpDumper::toYaml($definition);
$fbp = PhpFlo\Fbp\FbpDumper::toFbp($definition);

定义具有以下架构

$schema = [
    'properties' => ['name' => '',],
    'initializers' => [
        [
            'data' => '',
            'tgt' => [
                'process' => '',
                'port' => '',
            ],
        ],
    ],
    'processes' => [
        'ReadFile' => [
            'component' => '',
            'metadata' => [
                'label' => '',
            ],
        ],
    ],
    'connections' => [
        [
            'src' => [
                'process' => '',
                'port' => '',
            ],
            'tgt' => [
                'process' => '',
                'port' => '',
            ],
        ],
    ],
]

FBP DSL定义

如果您想编写定义文件,这里有一些规则

通用语法:

// <process_alias>(<optional_process_name>) <port><[optional_port_number]> -> <port><[optional_port_number]> <process_alias>(<optional_process_name>)
// examples
ReadFile(ReadFile) OUT -> IN SplitbyLines(SplitStr)
ReadFile() OUT -> IN SplitbyLines()
ReadFile() out[1] -> In[3] SplitbyLines()
  • 所有元素都是区分大小写的
  • 过程定义末尾的括号是必需的(即使为空):<process>()
  • 过程名称是w+
  • 端口号可以是[a-zA-Z_]
  • 每一行确定一个新的事件链,意味着至少有两个过程和两个连接端口,由" -> "分隔,如<process>() <port> -> <port> <process>()
  • 否则有一个<initializer> -> <port> <process>()

为了更好地理解,用于定义检查的整个正则表达式是

((?P<inport>[a-zA-Z_]+(\[(?P<inport_no>[0-9]+)\])?)\s)?((?P<process>[\w\/]+)(\((?P<component>[\w\/\\\.]+)?\))?)(\s(?P<outport>[a-zA-Z_]+(\[(?P<outport_no>[0-9]+)\])?))?

注释:您可以添加注释和空行以提高可读性和文档。如果第一行有注释,它将用作定义的名称。

# this definition reads files and counts their lines
ReadFile() OUT -> IN SplitbyLines()
ReadFile() out -> In SplitbyLines()

# some comment

# and for readability :-)
ReadFile(ReadFile) OUT -> IN SplitbyLines(SplitStr)

初始化器:您可以为图形设置初始值

'test.file' -> IN ReadFile()

多个定义:您可以在一行中包含完整的定义链以增强事件链的可视性

GreetUser() DATA -> OPTIONS Render() OUT -> STRING WriteResponse()

安装

通过composer进行常规安装

composer require phpflo/phpflo-fbp