使用 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 实体(带有用户名字段)。这对我来说很有意义。

假设我有一个 UserNotification 实体,也许还有一个连接的 UserNotification(带有 hasRead)实体。我想在我的 API 上公开一个端点,以将所有早于一个月的通知标记为已读。所以我可能会创建一个 ClearOldNotification 实体,同样带有用户名字段。

另一个例子可能是我想要一份报告,其中显示 Customers 由于某些条件而尚未联系。所以我想加入服务器中的表和 return 自定义 JSON 数据对象。我又可以制作一个 CustomerNoContact 实体。

我看到的问题是,我现在可以区分 实体,例如 UserProduct,而不是这些 服务类型实体。

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

清除旧通知

我想您已经找到了解决方案:使用 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 中,您应该注入负责重置密码和发送电子邮件的服务。

没有客户联系

这可能是 Custom (Doctrine ORM) Filter