alcidesrc / sequence
A PHP implementation of Chain of Responsability pattern
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
Sequence your tasks and make complex workflows more readable
[TOC]
Summary
This repository contains a Chain of Responsability design pattern implementation built with PHP.
Requirements
This library requires PHP^8.3
Installation
Install Sequence
using Composer:
composer require fonil/sequence
Usage
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');
Tasks
Sequence
requires at least a task to be run. You can attach any of the following entities as a task:
Invokable Class
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}
Explicit Task
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}
Custom Class
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}
Static Method
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 / Callback / Callable
$closure = function (array $payload): array { $payload['counter']++; return $payload; }; $result = Sequence::run($closure) ->startWith(['counter' => 0]); echo json_encode($result); // {"counter":1}
Sequence Instance
$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}
Examples
$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}
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities:
PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY
Supported Versions
Only the latest major version receives security fixes.
Reporting a Vulnerability
If you discover a security vulnerability within this project, please open an issue here. All security vulnerabilities will be promptly addressed.
License
The MIT License (MIT). Please see LICENSE file for more information.