snelling / sequence
1.0.2
2017-04-23 21:22 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/php-code-coverage: ^5.2
- phpunit/phpunit: 6.1.*
README
此库提供了一种对管道模式的不同实现。管道模式通常与生产线相比,其中每个阶段对给定的有效载荷/主题执行某种操作。阶段可以对有效载荷进行操作、操纵、装饰,甚至替换。
此库的目标是
- 体积小
- 易于理解
- 编写代码自然
警告:您可能不喜欢内部发生的魔法数量。话虽如此,请查看示例和源代码。目前大约有 ~150 行代码。
如果您想了解更多信息
- Martin Fowler 对集合管道进行了广泛的论述。
- The PHP League 有一个非常好的管道包。这个包启发了我。
许可证
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;