支持Laravel.io的持续发展 →

Laravel 中的数据传输对象(DTO)- 为什么要用以及如何使用

16 Jan, 2023 4 min read

简介

数据传输对象(DTO) 是一种设计模式,如果正确使用,可以提升应用程序的质量和可维护性。在本文中,我们将学习为什么您应该在应用程序中使用 DTOs,以及如何在 Laravel 中实现。

什么是数据传输对象

数据传输对象(DTO)是用于在软件系统或层次之间传递数据的模式。它是一个简单的对象,包含一组数据,通常以属性或字段的形式存在,表示系统中特定的实体或概念。DTO 的主要目的是解耦软件系统的不同层或组件,允许它们在不了解彼此实现细节的情况下进行通信和数据交换。

总结来说,DTO 是一个用于在不同层或组件之间传输数据的简单对象,有助于解耦和隔离这些组件。

为什么要使用 DTOs

从小型简单的代码库到大型复杂的代码库,有一些标准和模式我们可以使用,以确保我们的应用程序具有高质量的代码,易于维护、适应和更新。

数据结构标准在其中起着至关重要的作用。如果我了解某段代码中使用的数据库结构,那么维护它、更改它都变得非常容易,这也是 DTOs 发挥作用的地方。

假设我有这样一段代码

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->all()),
            Response::HTTP_CREATED
        ]);
    }
}

即使这只是简单的一段代码,如果一年前创建的,现在我需要更改 createUser 方法,我可能不会记得 $request->all() 方法返回哪些数据。

我可以重构这个代码以使用一个自定义的请求类

class UserController extends Controller
{
    public function store(CreateUserRequest $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->validated()),
            Response::HTTP_CREATED
        ]);
    }
}

在上述代码中,如果需要更新createUser方法,又不记得它使用哪些数据,可以前往CreateUserRequest进行查看。但这又引发了其他问题

  1. 数据的验证现在与HTTP请求耦合。如果需要在代码中调用createUser方法,需要手动重新验证数据。

  2. 你已经映射了数据,但因为$request->validated()返回的是一个数组,无法强制指定传递给createUser方法的参数类型。

如果在这里应用DTO模式,我们可以解决上面提到的两个问题。我们可以在DTO中映射和验证数据,如果需要从代码内部调用createUser方法,验证将自动完成,因为我需要传递一个DTO给该方法,并且它将强制指定我们可以传递给createUser方法的参数类型,因为我们现在需要为它传递一个特定的DTO

如何使用DTO

如上所述,DTO可以是映射属性的简单对象。因此,DTO最基本的实现将是一个简单的类,如下所示

class CreateUserDTO
{
    public function __construct(
        private string $name,
        private string $email,
        private string $username,
        private string $password
    ) {}

    // Add getters, setters, validation
}

然后,你可以从Request创建你的DTO

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser(new CreateUserDTO(...$request->all())),
            Response::HTTP_CREATED
        ]);
    }
}

这里:new CreateUserDTO(...$request->all()),我们使用了来自PHP 8命名参数来创建一个CreateUserDTO的实例。

通过这种方式,我们解决了上一个部分中详细说明的问题。现在,代码的质量和可维护性都得到了提高。

结论

在这篇文章中,我们学习了什么是数据传输对象(DTO),为什么我们应该在应用程序中使用它们以及如何在Laravel中使用它们。

如果你想在应用程序中使用DTO,我创建了一个这个包,这是一个通过提供包含验证自动类型转换基本DTO类以及用于创建DTOartisan命令来轻松开始使用DTO的好方法。

希望你喜欢这篇文章,如果你喜欢,不要忘了与你的朋友分享这篇文章!!!再见!

最后更新时间1年前。

driesvints, claudio1994-oliveira, neringali 点赞了此文章

3
喜欢这篇文章吗?让作者知道,并为他们鼓掌!
wendell_adriel (Wendell Adriel) PHP/Linux/Spark ana beautiful girl AKA techno craig calling themselves ' DateختلفATOR' resulting in weird usernames 🤖 Disability and sickness… 🤷‍♀️🤷 Health}{$end <شما می‌توانید یکی از این وضعیت‌ها را انتخاب کنید:

你可能还喜欢以下文章

2024年3月11日

如何使用 Larastan 将你的 Laravel 应用从 0 到 9

在 Laravel 应用执行之前就找出其中的错误是可能的,这要归功于... Larastan

阅读文章
2024年7月19日

无需 traits 标准化 API 响应

我注意到大多数用于 API 响应的库...

阅读文章
2024年7月17日

在 Laravel 项目中通过 Discord 通知收集反馈

如何在 Laravel 项目中创建一个反馈模块,并在接收到消息时收到 Discord 通知...

阅读文章

我们要感谢这些 精彩的公司 对我们的支持

您的标志在这里?

Laravel.io

Laravel 问题解决、知识共享和社区建设的门户。

© 2024 Laravel.io - 版权所有。