Laravel 响应类

发布时间: 作者:

Laravel Response Classes image

从你的 Laravel 应用程序响应,我认为是至关重要的,尤其是当你构建一个 API 时。让我们看看如何增强我们的响应。

我们中的许多人通常会从在应用程序中使用辅助函数开始,因为文档和许多教程都会使用它们。它们很容易上手,并且完全按照你的预期执行。让我们看看这些代码是什么样子的

return response()->json(
data: [],
status: 200,
);

这是一个略微夸张的例子,你通常会传递数据并跳过状态码。然而,对我来说,习惯很难改变!

此代码将为你创建一个新的 JsonResponse,并将数据和状态码传入,以便你返回它。这有效,并且使用这种方法没有任何问题。如果你已经使用它了,提高你的 API 游戏的一种方法是在这里添加状态码,以便对你返回的内容更具声明性。

展望未来,我们可以跳过使用辅助函数,并开始使用辅助函数创建的底层类。

return new JsonResponse(
data: [],
status: 200,
);

我喜欢这种方法,因为它对辅助函数的依赖较少,并且更具声明性。查看代码,你确切地知道返回了什么,因为它就在你眼前,而不是隐藏在辅助函数后面。你可以通过使用常量或另一种方法来声明状态码本身来提升它,从而使它更易于阅读和理解,即使是那些可能不了解所有状态码的开发人员。让我们看看它可能是什么样子的

return new JsonResponse(
data: [],
status: JsonResponse::HTTP_OK,
);

JsonResponse 类通过几个抽象层扩展了 Symfony Response 类,因此你可以直接调用它,但是,你的静态分析器可能会对此进行抱怨。我创建了一个名为 juststeveking/http-status-code 的包,这是一个 PHP 枚举,它将返回类似的东西,它唯一的任务是返回状态码。我更喜欢这种更轻量级的实用方法来处理像这样的事情,因为你确切地知道发生了什么以及这个类或包可能做什么。问题有时在于,你使用的类做了太多事情,以至于你必须将这个庞大的东西加载到内存中才能返回一个整数值。这没有多大意义,所以我建议使用专用包或类自己管理它。让我们看看这样做时它是什么样子的

return new JsonResponse(
data: [],
status: Http::OK->value,
);

这是我们代码的声明性如何清晰的一个重要进步。它易于阅读和理解正在发生的事情。但是,我们发现自己一次又一次地创建相同的代码块,那么我们如何解决这个问题呢?

答案很简单 - 响应类。在 Laravel 中,有一个我们可以使用的契约叫做 Responsable,它告诉我们我们的类必须有一个 toResponse 方法。我们可以直接从控制器返回它,因为 Laravel 会解析并理解这些类,没有问题。让我们看看这些类的一个简单的基本示例

class MyJsonResponse implements Responsable
{
public function __construct(
public readonly array $data,
public readonly Http $status = Http::OK,
) {}
 
public function toResponse($request): Response
{
return new JsonResponse(
data: $this->data,
status: $this->status->value,
);
}
}

这是一个简单的使用方式。但是,它没有为我们的应用程序添加任何价值。它只是对现有内容的抽象。让我们看看一些可能为我们的应用程序添加更多价值的内容。

class CollectionResponse implements Responsable
{
public function __construct(
public readonly JsonResourceCollection $data,
public readonly Http $status = Http::OK,
) {}
 
public function toResponse($request): Response
{
return new JsonResponse(
data: $this->data,
status: $this->status->value,
);
}
}

现在我们有一个响应类,它将处理我们传递的任何资源集合,使其在我们应用程序中非常可重用。让我们看看如何在控制器中返回它

return new CollectionResponse(
data: UserResource::collection(
resource: User::query()->get(),
),
);

它更简洁,代码重复更少,并且如果需要,可以轻松覆盖默认状态。它为我们提供了辅助方法和 Json Response 类提供的优势,但允许我们有更多上下文和可预测性。

但是,我们现在面临着在其他区域重复代码的问题。在我们自己的响应类中。许多这些看起来很相似,唯一的区别在于构造函数属性将是不同类型。我们想要保留使用自定义响应类的上下文,但我们想要避免为属性创建具有大量联合类型参数的内容,当我们可以添加 mixed 并完成它时。

在这种情况下,你可以选择使用抽象类进行扩展,或者使用特性将行为添加到需要它的类中。就我个人而言,我更喜欢组合而不是继承,因此使用特性对我来说更有意义。

trait SendsResponse
{
public function toResponse($request): Response
{
return new JsonResponse(
data: $this->data,
status: $this->status->value,
);
}
}

这种方法最大的问题是静态分析将对这段代码提出抱怨,因为特性需要拥有或知道类的属性。但这很容易解决。

/**
* @property-read mixed $data
* @property-read Http $status
*/

我们可以将此文档块添加到特性中,以便它了解它可以访问的属性。

现在我们的响应类将更容易使用和构建,代码重复更少。

class MessageResponse implements Responsable
{
use SendsResponse;
 
public function __construct(
public readonly array $data,
public readonly Http $status = Http::OK,
) {}
}

现在我们可以轻松地构建出我们需要发送的所有潜在响应,保持类型安全并减少代码重复。

Steve McDougall photo

技术作家,Laravel 新闻Treblle 的开发者倡导者。API 专家,资深 PHP/Laravel 工程师。YouTube 直播主.

分类于
Cube

Laravel 新闻稿

加入 40,000 多名其他开发者,绝不错过任何新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理你的服务器,并在几秒钟内部署你的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行 Tinker。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现在可以为你的 Laravel 项目聘用。 ⬧ 固定价格 7500 美元/月。 ⬧ 无冗长的销售流程。 ⬧ 无合同。 ⬧ 100%退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保你的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动的 Laravel 升级和代码现代化,让你的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

仅需 2500 美元/月,即可使用经验丰富的 Laravel 开发人员(拥有 4-6 年经验)为你的项目增效。获得 160 小时的专用专业知识和 15 天免费试用。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

现在就获得 Lucky - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 电子商务。一个开源包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表盘、身份验证、即用型组件、统计信息、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

你无缝 Laravel 升级、降低成本和加快创新的合作伙伴,帮助企业取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强你的 PHP 应用程序,让开发者能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 如何利用灵活的现代数据库来改变你的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖项输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到你的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章