czim / laravel-processor
Laravel 的管道式处理器框架。
Requires
- php: ^7.1|^8.0
- czim/laravel-dataobject: ^1.0|^2.0
- illuminate/database: ^5.0|^6.0|^7.0|^8.0
- illuminate/support: ^5.0|^6.0|^7.0|^8.0
Requires (Dev)
- czim/laravel-repository: *
- mockery/mockery: ^1.0
- orchestra/testbench: ^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
README
用于构建模块化、管道式数据处理框架。
背后的想法是拥有一个可配置、简洁且可测试的复杂数据处理设置。当然,这会带来很多开销,因此这仅适用于相当有要求(后台)的处理。
使用示例:这是为了更好地处理特定项目的广泛产品和对账单数据导入而构建的。导入的数据被转换为跨越多个表的数据库结构。使用管道式处理,这可以在离散的、可单独测试的过程步骤类中完成,每个类都有自己的职责。
安装
通过 Composer
$ composer require czim/laravel-processor
使用
扩展 Czim\PipelineProcessor
(或 Czim\AbstractProcessor
)并实现抽象方法。
通过在您的类上调用 process()
方法来执行处理。此方法的参数必须是 Czim\DataObject\Contracts\DataObjectInterface
的实现(有关更多信息,请参阅 czim\laravel-dataobject)。
$processor = new Your\Processor(); $data = new Your\DataObject($someData); $result = $processor->process($data); if ( ! $result->success) { ... }
返回的结果是 Czim\Processor\DataObjects\ProcessorResult
的一个实例。这是一个具有布尔 success
属性以及默认的 warnings
和 errors
消息包的 DataObject。
管道处理器
管道处理器由一系列按顺序执行的步骤组成。
处理上下文传递到管道中,并从步骤到步骤。它包含要处理的数据、缓存、设置等,其内容可以被修改以影响后续步骤的行为。
当抛出异常时,管道结束,剩余的步骤不会执行。
要使用它,扩展 Czim\PipelineProcessor
并将以下内容添加到您的类中
/** * @return array */ protected function processSteps() { // Set a series of process step classnames and return it // these steps must extend Czim\Processor\Steps\AbstractProcessStep // or otherwise implement Czim\Processor\Contracts\ProcessStepInterface return [ Your\ProcessSteps\ClassNameHere::class, Your\ProcessSteps\AnotherClassNameHere::class, ]; }
有关更多配置选项,请参阅 管道处理器的源代码。
处理步骤
处理步骤可以扩展 Czim\Processor\Steps\AbstractProcessStep
并实现 process()
方法。
protected function process() { // Define your custom processing here. // The data object can be accessed through $this->data // and the process context through $this->context }
处理上下文
ProcessContext 是一个表示管道步骤发生上下文的实例。它存储传递到 process()
方法的数据。它还可以存储设置和缓存。
还提供了一个 ContextRepositoryTrait
,以便在上下文中存储使用 czim\laravel-repository 包的存储库。
数据库事务
默认情况下,(主要)管道在数据库事务中执行;在成功完成所有步骤后提交,在任何异常抛出时回滚。
要无数据库事务地运行进程,请将以下属性设置在您的 PipelineProcessor
扩展中
protected $databaseTransaction = false;
简单处理器
如果管道过于复杂,您也可以使用更简单的方法。
扩展 Czim\AbstractProcessor
并将以下内容添加到您的类中
protected function doProcessing() { // Define your custom processing here. // The data object can be accessed through $this->data // The result data object that will be returned can // be modified through $this->result }
有关更多配置选项,请参阅 抽象处理器的源代码。
待办事项
- 使 App/Container 可注入,移除对 laravel 的 app() 函数的依赖
贡献
请参阅贡献指南以获取详细信息。
鸣谢
许可协议
MIT 许可协议(MIT)。有关更多信息,请参阅许可文件。