r4nkt / laravel-dto-action
这是一个(有点主观)的 Laravel 扩展包,旨在帮助用户更轻松、更统一地使用数据传输对象(DTO)来准备和执行操作。
Requires
- php: ^8.0
- laravel/framework: ^9.15
- spatie/data-transfer-object: ^3.7
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- orchestra/testbench: ^7.5
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.0
README
本扩展包受几位人士的启发。请参阅以下链接,了解灵感的来源:
还应注意的是,这其实是我自己的 待处理操作包 的一个变种,我希望它会更有用。
同样重要的是,这个扩展包是围绕 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
使用方法
目前,必须手动创建您的 Action 和 DataTransferObject 类。未来的版本将包含通过 php artisan 创建 Action 和 DataTransferObject 类的功能。
创建操作
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 类,您就可以开始使用它们。准备和执行操作有三个主要步骤
- 在您的
Action类上调用静态dto()方法。这将返回“操作感知”的 DTO。 - 可选地,对您的DTO进行任何其他更改。
- 最后,在待处理操作对象上调用
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)。有关更多信息,请参阅许可证文件。