alcidesrc/sequence

PHP 实现的职责链模式

1.0.0 2024-04-24 09:32 UTC

This package is auto-updated.

Last update: 2024-09-25 17:07:43 UTC


README

Continuous Integration

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 文件获取更多信息。