r4nkt/laravel-dto-action

这是一个(有点主观)的 Laravel 扩展包,旨在帮助用户更轻松、更统一地使用数据传输对象(DTO)来准备和执行操作。

v1.0.0 2022-06-20 10:11 UTC

This package is auto-updated.

Last update: 2024-09-20 16:14:56 UTC


README

Latest Version on Packagist Tests Quality Score Total Downloads

本扩展包受几位人士的启发。请参阅以下链接,了解灵感的来源:

还应注意的是,这其实是我自己的 待处理操作包 的一个变种,我希望它会更有用。

同样重要的是,这个扩展包是围绕 Spatie数据传输对象包 构建的。实际上,它是必需的。

简介

有时,您可能需要在应用程序或代码的不同部分执行任务或操作,而这些操作没有现成的 Laravel 解决方案。这很可能是或与您的业务逻辑有关。一个常用的例子是创建发票。这可能是在您的应用程序中需要执行的操作之一。它可能需要参数,并且可能由更小的操作组成。

本扩展包的目标是提供一种(有点主观)的方法来创建、定义和使用操作以及数据传输对象(DTO)。您可以为 Action 类创建类,然后当您想要执行该操作时,您可以“准备”该类: $myAction = MyAction::dto();。您将获得一个待处理操作对象,您可以定义它,并提供执行操作所需的参数。准备好后,您可以调用 execute()

以下是一个示例

$data = [
    'email' => 'me@mydomain.com',
    'list' => $emailList,
    'attributes' => $attributes,
    'confirm' => false,
    'send_welcome_mail' => false,
];

// create the DTO for the CreateSubscriber action and then execute the action
CreateSubscriber::dto($data)->execute();

安装

您可以通过 composer 安装此扩展包

composer require r4nkt/laravel-dto-action

使用方法

目前,必须手动创建您的 ActionDataTransferObject 类。未来的版本将包含通过 php artisan 创建 ActionDataTransferObject 类的功能。

创建操作

use R4nkt\LaravelDtoAction\Action;

class CreateSubscriber extends Action
{
    public function __invoke(CreateSubscriberDto $dto)
    {
        // code to perform action, using $dto as needed...
    }

    // supporting methods, if needed...
}

DTO 类命名规范

默认情况下,每个 Action 类将寻找一个具有相同完全限定名(FQCN)并以 Dto 结尾的 DTO 类。所以,对于我们的示例 CreateSubscriber 类,它将寻找 CreateSubscriberDto

要覆盖此行为,您可以在 Action 类中指定 DTO 类名称,如下所示

use R4nkt\LaravelDtoAction\Action;
use My\Custom\Namespace\UnconventionalCreateSubscriberDto;

class CreateSubscriber extends Action
{
    // override default DTO class
    protected static $dtoClass = UnconventionalCreateSubscriberDto::class;

    // ...
}

创建 DTO

要创建 DTO 类,请参阅 文档。创建后,只需添加 ExecutesDtoActions 特性即可

use App\EmailList;
use R4nkt\LaravelDtoAction\ExecutesDtoActions;
use Spatie\DataTransferObject\DataTransferObject;

class CreateSubscriberDto extends DataTransferObject
{
    use ExecutesDtoActions;

    public string $email;
    public EmailList $list;
    public array $attributes = [];
    public bool $confirm = true;
    public bool $send_welcome_mail = true;
}

“准备”您的操作,执行它

一旦构建了您的操作和 DTO 类,您就可以开始使用它们。准备和执行操作有三个主要步骤

  1. 在您的 Action 类上调用静态 dto() 方法。这将返回“操作感知”的 DTO。
  2. 可选地,对您的DTO进行任何其他更改。
  3. 最后,在待处理操作对象上调用execute()方法。

以下是一个一次性准备和执行操作的示例

UpdateLeaderboard::dto($data)->execute();

以下是一个示例,说明如何使用DTO为不同场景提供不同的参数以执行操作

$data = [
    'player' => $peter,
    'score' = $petersScore,
];

$updateLeaderboardDto = UpdateLeaderboard::dto($data);

$updateLeaderboardDto->execute();

$updateLeaderboardDto->player = $paul;
$updateLeaderboardDto->score = $paulsScore;
$updateLeaderboardDto->execute();

添加自定义静态构造函数

您还可以利用Spatie对DTO的自定义静态构造函数支持。按照文档添加自定义静态构造函数到您的DTO中,然后通过在名称前加上dto来通过操作调用它。

以下是如何做到这一点的示例

class UpdateLeaderboardDto extends DataTransferObject
{
    // ...

    public static function fromRequest(Request $request): self
    {
        return new self([
            'player' => Player::find($request->input('player_id')),
            'score' => $request->input('score'),
        ]);
    }
}

然后您可以使用它这样

UpdateLeaderboard::dtoFromRequest($request)->execute();

注意:此功能不受IDE支持,开发者将负责传递正确的参数类型。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全

如果您发现任何安全相关的问题,请使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件