使用 API 平台的自定义 REST 操作的最佳实践
Best practice for custom REST actions with API Platform
This top-ranking Whosebug answer 10 年前建议使用 POST /users/:user_id/reset_password
启动密码重置。
我知道 API 平台 recommends against using custom operations. The docs page for the Symfony Messenger integration 使用 ResetPasswordRequest
实体(带有用户名字段)。这对我来说很有意义。
假设我有一个 User
和 Notification
实体,也许还有一个连接的 UserNotification
(带有 hasRead
)实体。我想在我的 API 上公开一个端点,以将所有早于一个月的通知标记为已读。所以我可能会创建一个 ClearOldNotification
实体,同样带有用户名字段。
另一个例子可能是我想要一份报告,其中显示 Customers
由于某些条件而尚未联系。所以我想加入服务器中的表和 return 自定义 JSON 数据对象。我又可以制作一个 CustomerNoContact
实体。
我看到的问题是,我现在可以区分 纯 实体,例如 User
或 Product
,而不是这些 服务类型实体。
- 这种为操作创建单个实体的方法 类 是 Symfony 和 API 平台推荐的最佳实践吗?
- 我是否应该在我的应用程序中对这些实体进行不同的名称间距(或其他方式)以区分它们?
- 我可以想象,与 pure 实体相比,在一个非常大且复杂的应用程序中,您可以拥有数百个这样的 service 实体。这是预期的还是期望的?
- 谁能推荐一些关于这个模式的好资源?
您要求针对两个不同用例的最佳实践。让我们分解一下:
清除旧通知
我想您已经找到了解决方案:使用 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
class 是 Data Transfer Object (DTO)。在您的 ResetPasswordRequestHandler
中,您应该注入负责重置密码和发送电子邮件的服务。
没有客户联系
This top-ranking Whosebug answer 10 年前建议使用 POST /users/:user_id/reset_password
启动密码重置。
我知道 API 平台 recommends against using custom operations. The docs page for the Symfony Messenger integration 使用 ResetPasswordRequest
实体(带有用户名字段)。这对我来说很有意义。
假设我有一个 User
和 Notification
实体,也许还有一个连接的 UserNotification
(带有 hasRead
)实体。我想在我的 API 上公开一个端点,以将所有早于一个月的通知标记为已读。所以我可能会创建一个 ClearOldNotification
实体,同样带有用户名字段。
另一个例子可能是我想要一份报告,其中显示 Customers
由于某些条件而尚未联系。所以我想加入服务器中的表和 return 自定义 JSON 数据对象。我又可以制作一个 CustomerNoContact
实体。
我看到的问题是,我现在可以区分 纯 实体,例如 User
或 Product
,而不是这些 服务类型实体。
- 这种为操作创建单个实体的方法 类 是 Symfony 和 API 平台推荐的最佳实践吗?
- 我是否应该在我的应用程序中对这些实体进行不同的名称间距(或其他方式)以区分它们?
- 我可以想象,与 pure 实体相比,在一个非常大且复杂的应用程序中,您可以拥有数百个这样的 service 实体。这是预期的还是期望的?
- 谁能推荐一些关于这个模式的好资源?
您要求针对两个不同用例的最佳实践。让我们分解一下:
清除旧通知
我想您已经找到了解决方案:使用 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
class 是 Data Transfer Object (DTO)。在您的 ResetPasswordRequestHandler
中,您应该注入负责重置密码和发送电子邮件的服务。