snelling/sequence

安装: 15

依赖: 0

推荐者: 0

安全: 0

星标: 0

关注者: 3

分支: 0

公开问题: 0

类型:项目

1.0.2 2017-04-23 21:22 UTC

This package is auto-updated.

Last update: 2024-09-09 06:00:56 UTC


README

此库提供了一种对管道模式的不同实现。管道模式通常与生产线相比,其中每个阶段对给定的有效载荷/主题执行某种操作。阶段可以对有效载荷进行操作、操纵、装饰,甚至替换。

此库的目标是

  • 体积小
  • 易于理解
  • 编写代码自然

警告:您可能不喜欢内部发生的魔法数量。话虽如此,请查看示例和源代码。目前大约有 ~150 行代码。

如果您想了解更多信息

许可证

MIT许可证

设置

有两个对象

Sequence 对象

$sequence = (new Sequence)
    ->then(Callable)
    ->then(Callable, null);

$sequence->run(Payload);

Payload 对象

Payload 对象是提供的一种方式,可以神奇地封装您可以通过序列发送的值。

$payload = new Payload();

$payload->number = 1;       // Sets a number object to 1
echo $payload->number;      // Will return 1

$payload->setNumber(2);     // Sets the number object to 2
echo $payload->getNumber(); // Will return 2
echo $payload->number;      // Will return 2

echo $payload->notset;      // Will throw exception

$payload->setNotSet(true);  // Set the notset object
echo $payload->notset;      // Will return true

基本示例

如果您熟悉 League\Pipeline,您会感到宾至如归。以下是链式序列的精确副本

class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

class AddOneStage
{
    public function __invoke($payload)
    {
        return $payload + 1;
    }
}

$sequence = (new Sequence)
    ->then(new TimesTwoStage)
    ->then(new AddOneStage);

// Returns 21
$sequence->run(10);

可调用

class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

$sequence = (new Sequence)
    ->then(new TimesTwoStage)
    ->then(function ($payload) {
        return $payload + 1;
    });

// Returns 21
$sequence->run(10);

可重用

class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

class AddOneStage
{
    public function __invoke($payload)
    {
        return $payload + 1;
    }
}

$minusSequence = (new Sequence)
    ->then(function ($payload) {
        return $payload - 2;    // 2
    });

$sequence = (new Sequence)
    ->then(new TimesTwoStage)   // 1
    ->then($minusSequence)      // 2
    ->then(new AddOneStage);    // 3

// Returns 19
echo $sequence->run(10);

异常处理

$sequence = (new Sequence)
    ->then(function () {
        throw new LogicException();
    });

try {
    $sequence->run($payload);
} catch (LogicException $e) {
    // Handle the exception.
}

有效载荷

$payload         = new Payload();
$payload->number = 0;

$sequence = (new Sequence)
    ->then(function ($payload) {
        $payload->number = 1;

        return $payload;
    });

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;

将有效载荷返回到键

$payload         = new Payload();
$payload->number = 0;

$sequence = (new Sequence)
    ->then(function () {
        return 1;
    }, 'number');

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;

有效载荷依赖注入

$payload         = new Payload();
$payload->number = 0;

// Will automatically input $payload->number into $number
$sequence = (new Sequence)
    ->then(function ($number) {
        return ($number + 1);
    }, 'number');

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;

使用类型提示的有效载荷依赖注入

class Multiplier
{
    private $multiple;

    public function __construct(float $multiple)
    {
        $this->multiple = $multiple;
    }

    public function getMultiple(): float
    {
        return $this->multiple;
    }
}

class Multiply
{
    public function __invoke(Multiplier $multiplier, int $number)
    {
        return ($number * $multiplier->getMultiple());
    }
}

$payload             = new Payload();
$payload->multiplier = new Multiplier(2);
$payload->number     = 0;

$sequence = (new Sequence)
    ->then(function ($number) {
        return ($number + 1);
    }, 'number')                        // Will return 1
    ->then(new Multiply, 'number');     // Will return 1 * 2 = 2

$payload = $sequence->run($payload);

// Returns 2
echo $payload->number;