Sequence your tasks and make complex workflows more readable
[TOC]
This repository contains a Chain of Responsability design pattern implementation built with PHP.
This library requires PHP^8.3
Install Sequence
using Composer:
composer require fonil/sequence
Create a Sequence
instance and attach any type of payload through a simple interface:
$result = Sequence::run(FirstTask::class)
->then(SecondTask::class)
...
->then(LastTask::class)
->startWith('payload');
Sequence
requires at least a task to be run. You can attach any of the following entities as a task:
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}
$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}
Please review our security policy on how to report security vulnerabilities:
PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY
Only the latest major version receives security fixes.
If you discover a security vulnerability within this project, please open an issue here. All security vulnerabilities will be promptly addressed.
The MIT License (MIT). Please see LICENSE file for more information.