corbosman / laravel-pipeline-passable
Laravel 管道(Pipeline)的 Passable 类
Requires
- php: >=8.0.2
- illuminate/support: ^9.0
- spatie/data-transfer-object: ^2.6
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: ~9.0
README
Laravel 的 Pipeline 类只接受一个输入参数。这很遗憾地限制了您如何利用这个类。这是一个基于 Passable 类的解决方案,该类扩展了 Spatie 的数据传输对象(Data Transfer Object)。这是我自己在几个项目中需要的,所以我将其提取到一个包中。
安装
通过 Composer
$ composer require corbosman/laravel-pipeline-passable
使用方法
您应该熟悉 Laravel 管道的工作方式。它们用于路由器和中间件。它允许您通过一系列类传递一个变量,并返回结果。类似于 array_reduce。由于您不能传递多个变量,因此无法发送某种输入和输出,它们是分开的。这就是这个包的作用所在。它允许您创建一个具有多个属性的类,并在管道结束时返回其中一个属性作为结果。默认情况下,它只返回类本身作为结果,但您可以实现一个 return 方法来返回您想要的任何内容。
此包扩展了 Spatie 的 DataTransferObject,因此您可以查看他们的文档,了解如何实例化此类。它有助于了解 DTO 是什么以及如何使用它。有两种常见的模式,您可以通过构造函数传递您的类属性,或者创建一个静态方法。
构造函数
use CorBosman\Pipeline\Passable; class MyPipeline extends Passable { public string $username; public array $output; public function return() : array { return $this->output; } }
要使用此管道,请使用属性作为参数构造它,然后给它一些要管道化的类。
$output = (new MyPipeline(['username' => $foo, 'output' => []])->pipeline([ PipeClass1::class, PipeClass2::class ... ]);
工厂
有时使用工厂方法更容易。例如,您可以使用它来初始化响应数据传输对象。
use CorBosman\Pipeline\Passable; class MyPipeline extends Passable { public string $username; public Output $output; public static function factory($username) : self { return new self([ 'username' => $username, 'output' => new Output ]); } public function return() : array { return $this->output->toArray(); } }
$output = MyPipeline::factory($username)->pipeline([ PipeClass1::class, PipeClass2::class ... ]);
管道类
要将此 Passable 通过 Laravel 的 Pipeline 发送,请使用一个类数组调用 pipeline 方法。就像中间件类一样,您必须确保您的类调用下一个类,如下面的示例所示。Pipeline 类允许几种不同的选项。
- 具有 handle 方法的普通类
class Uppercase { public function handle(MyPipeline $passable, $next) { $passable->output = strtoupper($passable->username); return $next($passable); } }
- 可调用的类
class Uppercase { public function __invoke(MyPipeline $passable, $next) { $passable->output = strtoupper($passable->username); return $next($passable); } }
- 一个对象,注意该对象应该具有 handle 方法
$uppercase = new Uppercase; $result = MyPipeline::factory($input)->pipeline([$uppercase]);
更改调用的方法
默认情况下,每个管道类都会调用 handle() 方法。如果您想覆盖它,可以将方法名称设置为 pipeline() 方法的第二个参数。
$result = MyPipeline::factory($input)->pipeline([...], 'filter');
变更日志
请参阅 changelog 了解最近更改的更多信息。
贡献
请参阅 contributing.md 了解详细信息以及待办事项列表。
安全性
如果您发现任何安全问题,请通过电子邮件 cor@in.ter.net 而不是使用问题跟踪器。
鸣谢
许可
MIT。有关更多信息,请参阅 许可文件。