ApiPlatform/Symfony-在CRUD API上实现乐观锁定



Symfony,而不是Doctrine,通过向实体的属性添加@Version Annotation来提供乐观锁定。在实践中,用户实体上的版本属性将如下所示:


/**
* @Groups({
*     "user:item:get"
* })
* @ORMVersion
* @ORMColumn(type="integer")
*/
private $version;

@Groups Annotation中的user:item:getGroup将把版本属性的值添加到get请求的响应中。没有任何请求的直接实现,我们使用利用内部Provider/Persister系统的实体的CRUD-API。

让我们假设我们即将更改的用户资源的当前版本是10。

在该资源上执行PUT请求,其主体如下:

{
"zip": 10000
"version": 5
}

将完全有效。zip属性将更改为10000,即使版本号不匹配。

我做错了什么?是内部Persister系统无法自己验证版本号,还是我提供的版本号不正确——它不应该在请求正文中?

谢谢!

好的,我将api平台升级到3.0.0版本,现在它可以正常工作了。。。

如果使用PHP属性作为注释,则版本字段应该如下所示:

#[
Groups(["user:item:get","user:item:put"]),
Version,
Column(type: Types::INTEGER)
]
private int $version;

其中,user:item:get在get请求上公开该属性,user:item:put则在put请求上公开它。这样,内部持久系统就可以验证在请求主体中传递的版本。因此,我可能不需要升级,而是可以将user:item:putGroup添加到@Groups Annotation中。

另一个问题仍然存在,但这是目前已知的问题。发送正文中没有版本属性的PUT请求不会引发OptimisticLockException,请求将顺利通过。

最新更新