Giter Site home page Giter Site logo

chainer's Introduction

Chainer

Chain your actions and make a complex workflow more readable

Latest Version on Packagist Total Downloads tests Coverage Licence

Installation

Install Chainer using composer with the following command

composer require babicaja/chainer

Usage

Chain actions and pass any type of payload through a simple interface

Chain::do(TaskOne::class)
->then(TaskTwo::class)
->then(TaskThree::class)
->run('payload');

The actions passed to the Chainer\Chain->then() method can be any of the following

Link Instance

ℹ️ Link can be an instance or fqn Chain::do(new FirstAction()) or Chain::do(FirstAction::class)
namespace Examples;

use Chainer\Chain;
use Chainer\Link;

class FirstAction extends Link
{
    public function handle($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

class SecondAction extends Link
{
    public function handle($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

$result = Chain::do(FirstAction::class)
    ->then(SecondAction::class)
    ->run();

echo json_encode($result); 

Result

[
    "Examples\\FirstAction::handle",
    "Examples\\SecondAction::handle"
]

Chain Instance

namespace Examples;

use Chainer\Chain;
use Chainer\Link;

class FirstAction extends Link
{
    public function handle($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

class SecondAction extends Link
{
    public function handle($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

$chain = Chain::do(FirstAction::class)
    ->then(SecondAction::class);

$result = Chain::do($chain)
    ->then(FirstAction::class)
    ->run([]);

echo json_encode($result); 

Result

[
    "Examples\\FirstAction::handle",
    "Examples\\SecondAction::handle",
    "Examples\\FirstAction::handle"
]

Invokable Class

ℹ️ Invokable can be an instance or fqn Chain::do(new FirstAction()) or Chain::do(FirstAction::class)
namespace Examples;

use Chainer\Chain;

class FirstAction
{
    public function __invoke($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

class SecondAction
{
    public function __invoke($payload = null)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

$result = Chain::do(FirstAction::class)
    ->then(SecondAction::class)
    ->run();

echo json_encode($result); 

Result

[
    "Examples\\FirstAction::__invoke",
    "Examples\\SecondAction::__invoke"
]

Callback / Callable

namespace Examples;

use Chainer\Chain;

function helper($payload)
{
    $payload[] = __METHOD__;
    return $payload;
}

class Util
{
    public function method($payload)
    {
        $payload[] = __METHOD__;
        return $payload;
    }

    public static function staticMethod($payload)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

class App
{
    public function run()
    {
        return Chain::do(fn($payload) => $this->method($payload))
            ->then(fn($payload) => self::staticMethod($payload))
            ->then([new Util(), 'method'])
            ->then([Util::class, 'staticMethod'])
            ->then('Examples\helper')
            ->then(function ($payload) {
                $payload[] = __METHOD__;
                return $payload;
            })
            ->run([]);
    }

    private function method($payload)
    {
        $payload[] = __METHOD__;
        return $payload;
    }

    private static function staticMethod($payload)
    {
        $payload[] = __METHOD__;
        return $payload;
    }
}

$app = new App();
echo json_encode($app->run());

Result

[
    "Examples\\App::method",
    "Examples\\App::staticMethod",
    "Examples\\Util::method",
    "Examples\\Util::staticMethod",
    "Examples\\helper",
    "Examples\\{closure}"
]

Contributing

Contributors:

You are more than welcome to contribute to this project. The main goal is to keep it simple because there are more than enough libraries with advance features. To take your work into consideration please create a Pull Request along the following guidelines:

## What's the purpose of this PR?
(Insert the description of the purpose of this change here)
## Impact Analysis
(What will this possibly affect?)
## Where should the tester start?
(Hints tips or tricks regarding how to test this, things to watch out for, etc)
## What are the relevant tickets?
(Is this related to a ticket/bug at the moment?)

Don't forget to write unit tests! All contributors will be listed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.