phpflo/phpflo-bundle

将 phpflo 集成到 symfony

安装次数: 2,805

依赖项: 0

建议者: 0

安全: 0

星星: 4

关注者: 2

分支: 1

开放问题: 1

类型:symfony-bundle

v1.1.2 2017-02-27 09:54 UTC

This package is auto-updated.

Last update: 2024-08-24 05:15:01 UTC


README

License

此包基于 Henri Bergius 的库 phpflo,强烈建议阅读其 README 文件。创建此包的目的是为了更轻松地将 phpflo 集成到需要流程编程的 symfony 等环境中。我不得不重写部分初始 Network 类,以便利用组件注册表轻松通过 DIC 管理组件。此外,所有组件服务都应该定义为 "public: false",以避免 DIC 中的混乱。

安装

您可以通过以下方式添加:

 $ composer.phar require phpflo/phpflo-bundle

注意:此包需要 minimum-stability: dev 设置在根级别。否则,您可以首先添加 phpflo,然后再添加包。

 $ composer.phar require phpflo/phpflo dev-master
 $ composer.phar require phpflo/phpflo-bundle

这将首先以开发稳定性添加 phpflo,然后添加包。这是由于 composer 对间接依赖稳定性的处理。

配置

<?php
    // AppKernel.php
    // ...
        $bundles = [
            // ...
            new PhpFlo\PhpFloBundle\PhpFloBundle(),
        ];
    // ...

添加包后,您将有一个新的工厂服务 phpflo.network,它使用所有相应标记的服务注册表。另一个可能性是使用 phpflo.network_di 服务。这两个服务之间的区别是:network 使用注册表,组件仅在编译时 一次性 注册和收集。当在请求周期内使用网络并只构建一次时,这很有用。如果您正在处理例如长时间运行的过程,则应使用 network_di,其中每个组件都将作为从 DIC 中获取的新对象来构建每个网络。您可以使用以下步骤添加组件

组件类

<?php
namespace AppBundle\Component;

// AppBundle/Component/ReadFile.php

use PhpFlo\Component;
use PhpFlo\Port;

class ReadFile extends Component
{
    public function __construct()
    {
        $this->inPorts()->add('source', ['type' => 'string]);
        $this->outPorts()->add('out', []);
        $this->outPorts()->add('error', [];

        $this->inPorts()->source->on('data', [$this, 'readFile']);
    }

    public function readFile($data)
    {
        // ...
    }
}

请记住扩展 PhpFlo\Component 或实现 PhpFlo\ComponentInterface!

服务定义(phpflo.network)

# app/config/services.yml

services:
  app.read_file:
    public: false
    class: AppBundle\Component\ReadFile
    tags:
      - {name: phpflo.component, alias: read_file}

您可以为服务命名任何您想要的名称:唯一两个重要的事情是标签。它需要名称 "phpflo.component" 以在编译器传递时找到,而别名将被用作图形文件中的组件名称。

服务定义(phpflo.network_di)

# app/config/services.yml

services:
  app.read_file:
    lazy: true
    shared: false # force instantiation 
    class: AppBundle\Component\ReadFile
    tags: # optional
      - {name: phpflo.component, alias: read_file}

图形文件(app/config/my_graph.json)

{
  "properties": {
    "name": "Count lines in a file"
  },
  "processes": {
    "ReadFile": {
      "component": "read_file"
    },
    "SplitbyLines": {
      "component": "split_str"
    },
    "CountLines": {
      "component": "counter"
    },
    "Display": {
      "component": "output"
    }
  },
  "connections": [
    {
      "src": {
        "process": "ReadFile",
        "port": "out"
      },
      "tgt": {
        "process": "SplitbyLines",
        "port": "in"
      }
    },
    {
      "src": {
        "process": "ReadFile",
        "port": "error"
      },
      "tgt": {
        "process": "Display",
        "port": "in"
      }
    },
    {
      "src": {
        "process": "SplitbyLines",
        "port": "out"
      },
      "tgt": {
        "process": "CountLines",
        "port": "in"
      }
    },
    {
      "src": {
        "process": "CountLines",
        "port": "count"
      },
      "tgt": {
        "process": "Display",
        "port": "in"
      }
    }
  ]
}

构建器将自动在 '''app/config''' 中搜索提供的图形文件 - 如果您需要子目录,您可以在 '''subdir/graph.json''' 格式中提供文件名。

进程定义(network_di)

{
  ...
  "processes": {
    "ReadFile": {
      "component": "app.read_file"
    },
    "SplitbyLines": {
      "component": "split_str"
    },
    "CountLines": {
      "component": "counter"
    },
    "Display": {
      "component": "output"
    }
  },
  ...
}

将服务名称作为组件名称添加!

示例

在具有对 DIC 访问的 symfony 控制器中,您可以简单地创建一个图形,如下所示

<?php
    /** @var \PhpFlo\PhpFloBundle\Flow\Builder $builder */
    $network = $this->get('phpflo')
        ->fromFile('my_graph.json');

    $network->getGraph()
        ->addInitial(
            $this->getParameter('kernel.root_dir') . '/config/my_graph.json', "ReadFile", "source"
        );

许可证

PhpFloBundle 在 MIT 许可证下发布。有关完整许可证文本,请参阅 LICENSE自由软件,万岁!