简介
数据传输对象(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
进行查看。但这又引发了其他问题
-
数据的验证现在与HTTP请求耦合。如果需要在代码中调用
createUser
方法,需要手动重新验证数据。 -
你已经映射了数据,但因为
$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类以及用于创建DTO的artisan命令来轻松开始使用DTO的好方法。
希望你喜欢这篇文章,如果你喜欢,不要忘了与你的朋友分享这篇文章!!!再见!
driesvints, claudio1994-oliveira, neringali 点赞了此文章