alcidesrc / sequence
PHP 实现的职责链模式
1.0.0
2024-04-24 09:32 UTC
Requires
- php: ^8.3
Requires (Dev)
- php-parallel-lint/php-console-highlighter: ^1.0
- php-parallel-lint/php-parallel-lint: ^1.3
- phpmd/phpmd: ^2.15
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^11.0
- slope-it/clock-mock: ^0.4.0
- squizlabs/php_codesniffer: ^3.9
- symfony/var-dumper: ^7.0
README
Sequence
对任务进行排序,使复杂工作流程更易于阅读
[目录]
摘要
此仓库包含一个用 PHP 构建的 职责链 设计模式实现。
要求
此库需要 PHP^8.3
安装
使用 Composer 安装 Sequence
composer require fonil/sequence
用法
创建一个 Sequence
实例并通过简单接口附加任何类型的有效负载
$result = Sequence::run(FirstTask::class) ->then(SecondTask::class) ... ->then(LastTask::class) ->startWith('payload');
任务
Sequence
至少需要一个要运行的任务。您可以附加以下任何实体作为任务
可调用类
class InvokableIncrementCounter { public function __invoke(array $payload): array { $payload['counter']++; return $payload; } } $result = Sequence::run(InvokableIncrementCounter::class) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
显式任务
class IncrementTask implements TaskInterface { //... public function handle(mixed $payload = null): mixed { $payload['counter']++; return $payload; } } $result = Sequence::run(IncrementTask::class) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
自定义类
class IncrementCounter { public function add(array $payload): array { $payload['counter']++; return $payload; } } $result = Sequence::run([IncrementCounter::class, 'add']) ->startWith(['counter' => 0]); // OR $result = Sequence::run([new IncrementCounter(), 'add']) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
静态方法
class IncrementCounter { public static function add(array $payload): array { $payload['counter']++; return $payload; } } $result = Sequence::run([IncrementCounter::class, 'add']) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
闭包/回调/可调用
$closure = function (array $payload): array { $payload['counter']++; return $payload; }; $result = Sequence::run($closure) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
Sequence 实例
$closure = function (array $payload): array { $payload['counter']++; return $payload; }; $sequence = Sequence::run($closure)->then($closure); $result = Sequence::run($sequence) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":2}
示例
$result = Sequence::run($closure) // 1st execution => $counter is 1 ->then(InvokableIncrementCounter::class) // 2nd execution => $counter is 2 ->then([IncrementCounter::class, 'increment']) // 3rd execution => $counter is 3 ->then(IncrementTask::class) // 4th execution => $counter is 4 ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":4}
安全漏洞
请查看我们的安全策略,了解如何报告安全漏洞
请勿公开披露与安全相关的问题
支持版本
只有最新主要版本才会收到安全修复。
报告漏洞
如果您在此项目中发现安全漏洞,请在此处创建问题。所有安全漏洞都将得到及时解决。
许可
MIT 许可证 (MIT)。请参阅LICENSE 文件获取更多信息。