babicaja/chainer

链式调用你的操作,使复杂的流程更易于阅读

v1.1.1 2021-11-08 14:39 UTC

This package is auto-updated.

Last update: 2024-09-29 22:50:45 UTC


README

链式调用你的操作,使复杂的流程更易于阅读

Latest Version on Packagist Total Downloads tests Coverage Licence

安装

使用以下命令通过composer安装Chainer

composer require babicaja/chainer

使用

链式调用操作并通过简单的接口传递任何类型的负载

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

传递给Chainer\Chain->then()方法的操作可以是以下任何一种

链接实例

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); 

结果

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

链实例

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); 

结果

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

可调用类

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); 

结果

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

回调/可调用

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());

结果

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

贡献

贡献者

欢迎您为该项目做出贡献。主要目标是保持其简单性,因为已经有足够多的具有高级功能的库。为了考虑您的工作,请按照以下指南创建一个Pull Request

## 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?)

别忘了编写单元测试!所有贡献者都将被列出。