asm/phpflo-bundle

此包已被废弃,不再维护。作者建议使用phpflo/phpflo-bundle包。

将phpflo集成到symfony

安装: 149

依赖: 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: 2022-02-01 12:59:04 UTC


README

License

此包基于Henri Bergius的库phpflo,强烈建议您阅读其README。创建此包的目的是为了让symfony等环境更容易集成需要流程编程的phpflo。我不得不重写部分初始Network类,以便通过DIC轻松管理组件。此外,所有组件服务都应定义为"public: false",以避免污染DIC。

安装

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

 $ composer.phar require phpflo/phpflo-bundle

注意:此需要最小稳定性: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_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"
    }
  },
  ...
}

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

示例

在symfony控制器中,您可以使用DIC简单创建一个图,如下所示

<?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自由软件,万岁!