使用 DTO 简化 Laravel 中的数据传输

使用 dto 简化 laravel 中的数据传输

以下是有关如何使用 laravel data 创建数据传输对象 (dto) 的分步示例:

1. 安装 laravel 数据包

首先,使用 composer 安装 spatie/laravel-data 包。该软件包有助于创建 dto 并有效管理数据。

composer require spatie/laravel-data

2. 创建数据传输对象(dto)

安装包后,我们可以创建一个 dto 类来处理数据传输。假设我们有一个 user 实体,并且我们想要创建一个 dto 来传输用户数据。

运行以下 artisan 命令来生成新的 dto 类:

php artisan make:data userdata

这将在 app/data 目录中创建一个 userdata 类。

3. 在 dto 中定义属性和类型

现在,让我们编辑 userdata 类来定义您期望的 dto 属性和数据类型。

namespace appdata;use spatielaraveldatadata;class userdata extends data{    public function __construct(        public string $name,        public string $email,        public string $address,        public ?string $phone = null  // optional phone field    ) {}}

解释:

__construct 方法自动将传入值分配给 dto 属性。?string $phone = null 表示phone 属性是可选的。

4. 在控制器中使用 dto

现在 userdata dto 已创建,我们可以在控制器内使用它来处理传入数据、转换数据并在应用程序的各层之间传递数据。

namespace apphttpcontrollers;use appdatauserdata;use appmodelsuser;use illuminatehttprequest;class usercontroller extends controller{    public function store(request $request)    {        // validate the incoming request data        $validateddata = $request->validate([            'name' => 'required|string',            'email' => 'required|email',            'address' => 'required|string',            'phone' => 'nullable|string',        ]);        // create a userdata dto        $userdata = userdata::from($validateddata);        // you can now access $userdata->name, $userdata->email, etc.        user::create([            'name' => $userdata->name,            'email' => $userdata->email,            'address' => $userdata->address,            'phone' => $userdata->phone,        ]);        return response()->json(['message' => 'user created successfully']);    }}

解释:

userdata::from() 方法会自动将验证后的请求数据映射到 dto 对象。dto 对象现在可用于在控制器和模型(或应用程序的其他层)之间传输数据。

5. 使用 dto 转换数据

您也可以在返回响应时使用 dto 来转换数据。我们来修改 usercontroller 中的 show 方法,通过 dto 返回用户数据。

public function show(user $user){    // convert the user model to userdata dto    $userdata = new userdata(        name: $user->name,        email: $user->email,        address: $user->address,        phone: $user->phone    );    return response()->json($userdata);}

解释:

在这里,我们通过将 user 模型的属性传递到 dto 构造函数来手动创建 userdata dto。此 dto 可以直接作为 json 响应返回,确保结构化数据格式。

6. 带有集合的 dto

如果您正在处理数据集合,例如获取用户列表,dto 包也提供了一种简单的方法来处理集合。

public function index(){    $users = user::all();    // convert the collection of user models to a collection of userdata dtos    $usercollection = userdata::collection($users);    return response()->json($usercollection);}

解释:

userdata::collection($users) 方法将每个 user 模型映射到 userdata dto,将整个集合转换为 dto 列表。

7. 自定义数据转换

spatie/laravel-data 包允许自定义转换,例如重命名属性或添加计算字段。

class userdata extends data{    public function __construct(        public string $name,        public string $email,        public string $address,        public ?string $phone = null    ) {}    // add a custom method to compute a full contact string    public function fullcontact(): string    {        return "{$this->name} ({$this->email})";    }}

现在,您可以在使用此 dto 时使用 fullcontact() 来获取自定义格式的字符串。

8. 数据验证和 dto

您可以使用 laravel data 的规则功能直接在 dto 中添加验证规则。

namespace AppData;use SpatieLaravelDataAttributesValidationEmail;use SpatieLaravelDataAttributesValidationRequired;use SpatieLaravelDataData;class UserData extends Data{    public function __construct(        #[Required] public string $name,        #[Email] public string $email,        public string $address,        public ?string $phone = null    ) {}}

解释:

借助 #[required] 和 #[email] 等验证属性,您可以直接在 dto 级别强制执行验证,从而进一步简化流程。

结论

在本实践教程中,我们探索了如何使用 laravel data 创建和使用数据传输对象 (dto)。使用 dto 模式,您可以干净地管理和转换数据,确保应用程序各层之间的关注点分离,同时使代码更易于维护。 spatie/laravel-data 包简化了 dto 管理,为开发人员和大型应用程序提供易于使用的功能。

以上就是使用 DTO 简化 Laravel 中的数据传输的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1247060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 19:08:22
下一篇 2025年12月8日 07:03:26

相关推荐

  • PHP 函数单元测试中的常见错误及解决方案

    在编写 php 函数单元测试时,常见的错误包括:缺乏隔离环境、对私有方法进行测试以及未测试边缘情况。具体解决方案为:使用依赖项注入创建隔离环境;使用反射覆盖私有方法进行测试;仔细考虑所有可能输入输出并编写测试用例涵盖边缘情况。通过避免这些错误,可以编写可靠的函数单元测试,提升代码质量和稳定性。 PH…

    2025年12月9日
    000
  • PHP 函数如何使用 GraphQL 调用外部函数?

    使用 php graphql() 函数调用外部 graphql 函数:安装 graphql 客户端库(composer require graphql/graphql)。创建 graphql 客户端并指定 graphql api 的端点。编写查询内容并使用 query() 函数执行查询。从结果中获取…

    2025年12月9日
    000
  • C 扩展和 PHP 函数之间的通信机制是什么?

    c 扩展与 php 函数通信可通过以下机制:1. 参数传递:php 函数可向 c 扩展传递参数值;2. 返回值:c 扩展可通过 return_* 宏返回 php 值;3. 全局变量:c 扩展可访问 php 代码中已声明的全局变量;4. 回调函数:c 扩展可注册 php 回调函数,以便在特定事件发生时…

    2025年12月9日
    000
  • 如何使用 PHP 库调用第三方外部函数

    要使用 php 库调用外部函数,需要:使用 composer 安装库;通过 require() 函数加载库;根据库的 api 文档使用其函数。 如何使用 PHP 库调用第三方外部函数 要使用 PHP 库调用第三方外部函数,您需要在代码中加载该库并使用该库提供的函数。以下是如何操作: 1. 安装库 立…

    2025年12月9日
    000
  • PHP 函数单元测试的自动化流程

    PHP 函数单元测试的自动化流程 简介 单元测试对于确保软件代码的正确性和健壮性至关重要。PHPUnit 是 PHP 中一个流行的单元测试框架,可简化单元测试的创建和自动化。本教程将指导您逐步实现 PHP 函数单元测试的自动化流程。 安装 PHPUnit 首先,您需要在您的项目中安装 PHPUnit…

    2025年12月9日
    000
  • PHP 函数性能测试与分析的利器

    通过使用 tideways php 扩展,您可以:快速分析和测试 php 函数性能。轻松识别性能瓶颈,优化代码。通过调用图、火焰图和统计信息深入了解函数调用情况。优化循环性能,检测并解决内存泄漏。 PHP 函数性能测试与分析的利器:Tideways Tideways 是一个轻量级、高性能的 PHP …

    2025年12月9日
    000
  • PHP 函数单元测试的持续集成实践

    通过设置持续集成 (ci) 流水线,我们可以自动化 php 函数单元测试:选择 ci 工具 (例如 jenkins、travis ci 或 circleci) 并配置它以在每次提交或拉取请求时触发构建。작성 pipeline 脚本来运行代码样式检查、单元测试和部署更改。使用 phpunit 框架编写…

    2025年12月9日
    000
  • 提高 PHP 效率:经过验证的性能优化技术

    优化 php 性能可确保我们的 web 应用程序平稳运行、快速响应并高效处理流量。下面是关于如何有效地最大化 php 性能的详细分步指南,并为每种优化策略提供了实践示例。 第 1 部分:更新到最新的稳定 php 版本 第 1 步:检查当前 php 版本 首先检查系统上安装的当前 php 版本: ph…

    2025年12月9日
    000
  • 处理 Laravel Blade 模板中的枚举值

    laravel 中的枚举提供了一种结构化的方式来表示一组常量值。然而,当涉及到在 blade 模板中使用枚举时,事情有时会变得不清楚,特别是在比较条件渲染的值时。在本文中,我将引导您了解在 blade 模板中处理枚举值的正确方法,帮助您避免常见的陷阱。 了解挑战 laravel 枚举是定义特定状态或…

    2025年12月9日
    000
  • 使用linter工具实现PHP函数参数类型检查

    通过使用linter工具phpstan,我们可以实现php函数参数的类型检查。phpstan是一种静态分析工具,可通过分析变量类型的推断来检查函数参数类型。我们可以使用composer安装phpstan并通过配置phpstan.neon文件来设置检查级别。phpstan通过类型断言和严格类型检查来检…

    2025年12月9日
    000
  • 在 Laravel 11 中的支付处理编译时实现上下文绑定

    在我们之前的文章(如何在 laravel 11 中添加和实现支付处理接口:硬编码绑定)中,我们通过硬编码 paymentprocessorinterface 和特定实现(如 stripepaymentprocessor)之间的绑定来探索设置支付处理器的第一步。 虽然这种方法对于小型应用程序来说简单有…

    2025年12月9日
    000
  • 命名参数在 PHP 生态系统中其他组件(如框架)中的应用

    命名参数在 PHP 生态系统中其他组件的应用 在 PHP 中,命名参数允许你按名称将参数传递给函数或方法,而不是按位置。这提供了更好的可读性和可维护性,尤其是在处理具有许多参数的函数时。 除了核心 PHP,命名参数还在框架和库中得到了广泛应用,例如: Laravel Framework 立即学习“P…

    2025年12月9日
    000
  • 如何通过调整 PHP 配置来预防堆栈溢出?

    通过调整 php 配置中的 memory_limit 设置来增加堆栈大小,可以有效防止堆栈溢出。建议的堆栈大小为 256m 至 512m,但需根据应用程序的实际情况灵活调整。此外,避免过多的递归调用、限制函数调用深度和使用内存剖析器识别内存泄漏等措施也有利于预防堆栈溢出。 如何通过调整 PHP 配置…

    2025年12月9日
    000
  • 怎样在 PHP 中检测堆栈溢出?

    如何在 PHP 中检测堆栈溢出? 堆栈溢出是一种常见的错误,当函数调用过多或递归函数陷入无限循环时会发生。在 PHP 中检测堆栈溢出至关重要,以确保你的应用程序不会崩溃。 什么是堆栈溢出? 在计算机科学中,堆栈是一个数据结构,用于存储函数调用信息。当调用函数时,函数的局部变量和参数保存在堆栈上。如果…

    2025年12月9日
    000
  • 使用 Composer 时的 PHP 命名空间管理?

    Composer 中的 PHP 命名空间管理 简介 Composer 是 PHP 的一个依赖管理工具,它提供了管理代码库中的外部依赖项和类库的功能。命名空间是组织和引用类和函数的一种方法,在使用 Composer 时,命名空间管理至关重要。 使用命名空间 在 PHP 中,可以使用 namespace…

    2025年12月9日
    000
  • PHP 命名空间别名使用的场景?

    php命名空间别名场景:缩写冗长命名空间名称(如 laravel facade)。避免潜在命名冲突(使用别名区分相似库)。组织相关代码(如数据库操作别名 db)。 PHP 命名空间别名使用的场景 PHP 命名空间别名用于缩写长命名空间名称,增强代码的可读性和可维护性。在以下场景中使用命名空间别名很有…

    2025年12月9日
    000
  • PHP 函数的函数指针的局限性是什么?

    php 函数指针存在局限性:无法访问类中的私有成员;在不同对象上引用实例方法时可能出错;无法在所有范围内使用;使用序列化时可能会导致问题。实战案例:函数指针可简化回调函数,如对数组进行大小写排序。 PHP 函数的函数指针的局限性 在 PHP 中,函数指针是一个指向函数的变量。虽然函数指针提供了强大的…

    2025年12月9日
    000
  • PHP 命名空间管理的最佳实践

    php 命名空间管理最佳实践遵循 psr-4 标准,定义命名空间到文件路径的映射。使用 composer 自动加载类,它遵循 psr-4 标准。避免在全局命名空间声明类或函数,以防止名称冲突。使用 psr-0 或 psr-4 命名空间标准,为类和函数提供明确的命名空间。使用清晰的命名约定,为命名空间…

    2025年12月9日
    000
  • PHP 命名空间中的冲突解决方法?

    php 中命名空间冲突的解决方法包括:使用 use 语句导入类或函数;使用别名指定导入类或函数的名称;使用匿名函数创建新的命名空间;使用子命名空间组织类和函数;管理 composer 的 autoload.php 文件以控制类加载顺序。 PHP 命名空间中的冲突解决方法 在 PHP 中使用命名空间可…

    2025年12月9日
    000
  • PHP 命名空间:实用技巧和用法实例

    命名空间是组织和管理 php 实体的机制,用于避免名称冲突并提高代码可读性。要声明命名空间,使用 namespace 关键字;要使用命名空间中的类,使用完全限定名称;可以使用 use 指定别名;命名空间可以嵌套,使用点号分隔器;配置 composer.json 文件中的自动加载器规则以避免在每个文件…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信