【问题标题】:Is there a programmatic way to decide if API Platform can access updates to an Entity?是否有一种编程方式来决定 API 平台是否可以访问实体的更新?
【发布时间】:2021-10-15 04:00:58
【问题描述】:

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

class Report
{
    private $status;

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

我想做的是当报告报告的状态为已归档时,以停止发生更多更新。

最好的策略是什么?

  • 自定义控制器
  • 验证组
  • 听众/订阅者

或者还有什么我错过的?

【问题讨论】:

    标签: api-platform.com


    【解决方案1】:

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

    最原生的方法是实现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
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多