是否有一种编程方式来决定 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 报告的状态为已存档时,停止任何更新的发生。
最好的策略是什么?
- 自定义控制器
- 验证组
- Listener/Subscriber
或者我还遗漏了什么?
我认为最好的策略取决于您的理念和应用程序的权限。
最本机的方法是实现 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
}
鉴于此,您可以实施任何您想要的服务。我认为在您列举的那些中没有更好的选择。由你决定。
我有一个名为 Report 的实体。 在报告中,我有一个状态字段。
class Report
{
private $status;
const STATUS_DRAFT = 1;
const STATUS_ACTIVE = 2;
const STATUS_ARCHIVED = 3;
}
我想做的是当 Report 报告的状态为已存档时,停止任何更新的发生。
最好的策略是什么?
- 自定义控制器
- 验证组
- Listener/Subscriber
或者我还遗漏了什么?
我认为最好的策略取决于您的理念和应用程序的权限。
最本机的方法是实现 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
}
鉴于此,您可以实施任何您想要的服务。我认为在您列举的那些中没有更好的选择。由你决定。