Php RESTAPI两个独立的资源来创建一个用户?

Php RESTAPI两个独立的资源来创建一个用户?,php,rest,api-design,Php,Rest,Api Design,目前正在构建一个RESTAPI,其功能之一是创建用户。我的应用程序有两种创建用户的方法: 注册后,用户添加自己的常用数据:电子邮件、密码、用户名、出生日期 手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据 我的设置是一个users表、users\u metadata表和users\u permissions表以及其他一些表。电子邮件和密码存储在users表中,用户名和出生日期存储在users\u metadata表中。手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数

目前正在构建一个RESTAPI,其功能之一是创建用户。我的应用程序有两种创建用户的方法:

  • 注册后,用户添加自己的常用数据:电子邮件、密码、用户名、出生日期
  • 手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据
我的设置是一个
users
表、
users\u metadata
表和
users\u permissions
表以及其他一些表。电子邮件和密码存储在
users
表中,用户名和出生日期存储在
users\u metadata
表中。手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据

有两种不同的资源来处理创建用户是否更好

有两种不同的资源来处理创建用户是否更好

我不会创建两个不同的资源,它们都代表
用户
,并且都对其创建过程建模。因为一个用户就是一个用户,我认为他们应该通过相同的资源创建

手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据

手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据

如果有意义,您可以将这些额外的数据建模为一个单独的(子)资源。权限也是如此。然后,该子资源可以有自己的URL(例如
/users/{id}/meta
/users/{id}/permissions
),客户机向其发出单独的
POST
请求,或者可以将其嵌套在发送到API的数据结构中,如下所示:

{
    "name": "John",
    "email-address": "john@doe.com",
    "permissions": {
        "read": true,
        "write": false
    },
    "meta-data": {
        "date-of-birth": "2000-01-01"
    }
}
在各自的URL上使用独立子资源的方法使访问控制和验证变得更容易。另一方面,它给客户带来了更大的负担。它还可以将您置于管理员创建用户的位置,保存基本信息,但保存权限时出错;根据您的用例,您可能需要也可能不需要以某种方式自动处理它

子资源嵌套在数据结构中的方法使得处理
POST
请求的逻辑更加复杂,但它确实使客户端的工作更容易,并且让您可以选择将整个操作封装在事务中,并在出现问题时回滚,从而使整个操作成为原子操作

注:这两种方法并不相互排斥;如果你愿意,你可以两者兼得

这些方法中哪种最好将取决于有多少子资源、它们有多复杂以及对子资源的访问控制有多复杂;子资源越多和/或访问控制越复杂,我就越有可能为子资源设置不同的URL

在这个特定的例子中,我将在数据结构中对子资源进行净值计算,并让客户机同时发布所有数据

有两种不同的资源来处理创建用户是否更好

我不会创建两个不同的资源,它们都代表
用户
,并且都对其创建过程建模。因为一个用户就是一个用户,我认为他们应该通过相同的资源创建

手动创建,管理员添加了一个用户与通常的数据和任何需要的额外数据

手动创建用户时,可以更改其他元数据和用户权限以及其他表中的数据

如果有意义,您可以将这些额外的数据建模为一个单独的(子)资源。权限也是如此。然后,该子资源可以有自己的URL(例如
/users/{id}/meta
/users/{id}/permissions
),客户机向其发出单独的
POST
请求,或者可以将其嵌套在发送到API的数据结构中,如下所示:

{
    "name": "John",
    "email-address": "john@doe.com",
    "permissions": {
        "read": true,
        "write": false
    },
    "meta-data": {
        "date-of-birth": "2000-01-01"
    }
}
在各自的URL上使用独立子资源的方法使访问控制和验证变得更容易。另一方面,它给客户带来了更大的负担。它还可以将您置于管理员创建用户的位置,保存基本信息,但保存权限时出错;根据您的用例,您可能需要也可能不需要以某种方式自动处理它

子资源嵌套在数据结构中的方法使得处理
POST
请求的逻辑更加复杂,但它确实使客户端的工作更容易,并且让您可以选择将整个操作封装在事务中,并在出现问题时回滚,从而使整个操作成为原子操作

注:这两种方法并不相互排斥;如果你愿意,你可以两者兼得

这些方法中哪种最好将取决于有多少子资源、它们有多复杂以及对子资源的访问控制有多复杂;子资源越多和/或访问控制越复杂,我就越有可能为子资源设置不同的URL


在这种特定情况下,我将对数据结构中的子资源进行联网,并让客户端同时发布所有数据。

这取决于,如果要限制用户,可以有多个端点,一个用于受限制的用户,一个用于管理员,如果你想限制用户,你可以有多个端点——一个用于受限制的用户,一个用于管理员——这是个很好的主意,但是无法创建一个同时具有权限和元数据(事务性)的用户可能会有问题。你是对的,这肯定是不使用“不同URL的子资源”的原因方法我试着解释,在以“它也可以把你放在哪里”开头的句子中;如果那部分不清楚,请告诉我;我会试着想出一个更好的方法来表达我的观点。当然;)不