phpflo / phpflo-bundle
将 phpflo 集成到 symfony
Requires
- php: >=5.5.9
- phpflo/phpflo: ^1.0
- symfony/symfony: ^2.8 || ^3.0
Requires (Dev)
- mikey179/vfsstream: ~1.0
- phpunit/phpunit: <5.0
This package is auto-updated.
Last update: 2024-08-24 05:15:01 UTC
README
此包基于 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。 自由软件,万岁!