问题描述
10 年前的
This top-ranking Stackoverflow answer 建议使用 POST /users/:user_id/reset_password
启动密码重置。
我了解 API 平台 recommends against using custom operations。 Symfony Messenger integration 的文档页面使用 ResetPasswordRequest
实体(带有用户名字段)。这对我来说很有意义。
假设我有一个 User
和 Notification
实体,可能还有一个加入的 UserNotification
(带有 hasRead
)实体。我想在我的 API 上公开一个端点,以将所有超过一个月的通知标记为已读。所以我可能会创建一个 ClearOldNotification
实体,再次使用用户名字段。
另一个例子可能是我想要一份报告,显示由于某些条件而没有联系的 Customers
。所以我想加入服务器中的表并返回一个自定义的 JSON 数据对象。我再次可以创建一个 CustomerNoContact
实体。
我看到的问题是我现在区分了纯实体,例如User
或Product
,而不是这些服务 输入实体。
- 这种为操作创建单个实体类的方法是否是 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。