使用 API 平台自定义 REST 操作的最佳实践

问题描述

10 年前的

This top-ranking Stackoverflow answer 建议使用 POST /users/:user_id/reset_password 启动密码重置。

我了解 API 平台 recommends against using custom operationsSymfony Messenger integration 的文档页面使用 ResetPasswordRequest 实体(带有用户名字段)。这对我来说很有意义。

假设我有一个 UserNotification 实体,可能还有一个加入的 UserNotification(带有 hasRead)实体。我想在我的 API 上公开一个端点,以将所有超过一个月的通知标记为已读。所以我可能会创建一个 ClearOldNotification 实体,再次使用用户名字段。

一个例子可能是我想要一份报告,显示由于某些条件而没有联系的 Customers。所以我想加入服务器中的表并返回一个自定义的 JSON 数据对象。我再次可以创建一个 CustomerNoContact 实体。

我看到的问题是我现在区分了实体,例如UserProduct,而不是这些服务 输入实体。

  • 这种为操作创建单个实体类方法是否是 Symfony 和 API 平台推荐的最佳实践?
  • 我是否应该在我的应用中对这些实体进行不同的命名间距(或其他什么)以区分它们?
  • 我可以想象在一个非常庞大而复杂的应用程序中,与实体相比,您可以拥有数百个这样的服务实体。这是预期的还是期望的?
  • 谁能推荐一些关于这种模式的好资源?

解决方法

您要求针对两个不同用例的最佳实践。让我们分解一下:

清除旧通知

我认为您已经找到了解决方案:使用 Messenger。正如您所读到的,此用例的文档中有一个示例:

#[ApiResource(collectionOperations: [
        "post","get","delete","reset_password" => ["status" => 202,"messenger" => "input","input" => ResetPasswordRequest::class,"output" => false,"method" => "POST","path" => "/users/reset_password"]
    ]
)]
final class User
{
}

ResetPasswordRequest 类是一个 Data Transfer Object (DTO)。在您的 ResetPasswordRequestHandler 中,您应该注入负责重置密码和发送电子邮件的服务。

CustomerNoContact

这可能是一个 Custom (Doctrine ORM) Filter