Symfony 实体Id验证

Symfony 实体Id验证,symfony,validation,Symfony,Validation,我正在编写RESTAPI,其中资源是实体。Id字段有一个问题,它在创建新实体时有NoBlank和NotNull约束(这是逻辑的)——显然,新实体在写入DB之前没有Id。然而,验证组件当然表示实体无效。如何在不删除Id字段约束的情况下解决此问题?在我看来,您的Id不应该受到约束 创建的Url应该是[POST]/resource,编辑的Url应该是[PUT]/resource/{id} (或POST/PATCH,具体取决于使用rest HTTP方法的严格程度) 这样,id始终是必需的 如果不需要这种

我正在编写RESTAPI,其中资源是实体。Id字段有一个问题,它在创建新实体时有NoBlank和NotNull约束(这是逻辑的)——显然,新实体在写入DB之前没有Id。然而,验证组件当然表示实体无效。如何在不删除Id字段约束的情况下解决此问题?

在我看来,您的Id不应该受到约束

创建的Url应该是
[POST]/resource
,编辑的Url应该是
[PUT]/resource/{id}

(或POST/PATCH,具体取决于使用rest HTTP方法的严格程度)

这样,id始终是必需的

如果不需要这种路由逻辑,可以使用


我认为你不应该限制你的身份证

创建的Url应该是
[POST]/resource
,编辑的Url应该是
[PUT]/resource/{id}

(或POST/PATCH,具体取决于使用rest HTTP方法的严格程度)

这样,id始终是必需的

如果不需要这种路由逻辑,可以使用


我们讨论的是自动递增整数ID、预插入确定的UUID还是介于两者之间的东西?您的实体在什么时候获取ID?在这种情况下是增量的,但实际上这并不重要。我正在使用表单并通过API发送JSON。当JSON包含实体数据时,我需要验证(通过标准表单组件)实体。但由于实体在此阶段当然没有id,因此出现了验证错误。我认为验证自动生成的id没有多大意义。但您可以始终坚持,然后手动使用验证程序服务。@Yoshi ok。但是我不能在持久化之前进行验证,因为我需要在实体进入DB之前检查它是否正确?但如果必须这样做,您总是会有一个id来删除。但是,自动生成的id也不需要验证。如果该分配失败,那么与系统相关的、您可能无论如何都无法从中恢复的某个操作将失败。我们是在讨论自动递增整数ID、预插入确定的UUID还是介于两者之间的其他操作?您的实体在什么时候获取ID?在这种情况下是增量的,但实际上这并不重要。我正在使用表单并通过API发送JSON。当JSON包含实体数据时,我需要验证(通过标准表单组件)实体。但由于实体在此阶段当然没有id,因此出现了验证错误。我认为验证自动生成的id没有多大意义。但您可以始终坚持,然后手动使用验证程序服务。@Yoshi ok。但是我不能在持久化之前进行验证,因为我需要在实体进入DB之前检查它是否正确?但如果必须这样做,您总是会有一个id来删除。但是,自动生成的id也不需要验证。如果该任务失败,则与系统相关的、您可能无论如何都无法从中恢复的某项任务失败。好的,这似乎是解决方案。我不是REST纯粹主义者,事实上我想知道是否只留下POST用于创建/更新(如果JSON包含Id,则它是一个更新)。或者过于简单化了?老实说,只有Get/Post就足够了。我仍然更喜欢在url中使用id,因为它非常常见(这样其他人会更快地理解您的代码),而且您必须公开
[GET]/user/{id}
无论如何,当有人在创建(POST)时试图在JSON中发送“id”时,您是否做了任何事情(验证)实体?最好不要发送id。客户端不应该指定要使用哪个id创建ressource(他不知道此信息)。忽略id或发送验证错误。我个人从不在dataOk中使用id,这似乎是解决方案。我不是REST纯粹主义者,事实上我想知道是否只留下POST用于创建/更新(如果JSON包含Id,则它是一个更新)。或者过于简单化了?老实说,只有Get/Post就足够了。我仍然更喜欢在url中使用id,因为它非常常见(这样其他人会更快地理解您的代码),而且您必须公开
[GET]/user/{id}
无论如何,当有人在创建(POST)时试图在JSON中发送“id”时,您是否做了任何事情(验证)实体?最好不要发送id。客户端不应该指定要使用哪个id创建ressource(他不知道此信息)。忽略id或发送验证错误。我个人从不在数据中使用id
/**
 * @Assert\NotNull(groups={"create"})
 */
private $id;
/**
 * @Assert\NotNull(groups={"create","edit"})
 */
private $whatever;