是否有一种编程方式来决定 API 平台是否可以访问实体的更新?

Is there a programmatic way to decide if API Platform can access updates to an Entity?

我有一个名为 Report 的实体。 在报告中,我有一个状态字段。

class Report
{
    private $status;

    const STATUS_DRAFT = 1;
    const STATUS_ACTIVE = 2;
    const STATUS_ARCHIVED = 3;
}

我想做的是当 Report 报告的状态为已存档时,停止任何更新的发生。

最好的策略是什么?

或者我还遗漏了什么?

我认为最好的策略取决于您的理念和应用程序的权限。

最本机的方法是实现 security_post_denormalize 属性,但这意味着必须对当前用户进行身份验证。:

/**
 * @ApiResource(
 *     ...
 *
 *     itemOperations = {
 *          "get",
 *          "put" = {
 *              "security_post_denormalize" = "previous_object.getStatus() !== constant('App\Entity\Report::STATUS_ARCHIVED')",
 *              "security_message" = "You can't update this report because it is archived."
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=ReportRepository::class)
 */
class Report

否则,如果您不使用 GraphQl 系统,则可以从当前 Request:

访问 previous_object
$previousObject = $request->get('previous_data');
if ($previousObject->getStatus() === Report::STATUS_ARCHIVED) {
    // abort
}

鉴于此,您可以实施任何您想要的服务。我认为在您列举的那些中没有更好的选择。由你决定。