corbosman/laravel-pipeline-passable

Laravel 管道(Pipeline)的 Passable 类

2.0.0 2022-03-01 11:46 UTC

This package is auto-updated.

Last update: 2024-08-29 05:09:58 UTC


README

Latest Version on Packagist Total Downloads

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。有关更多信息,请参阅 许可文件