【问题标题】:How to update a StatisticEntity on each PUT request to API Plateform如何在对 API 平台的每个 PUT 请求上更新统计实体
【发布时间】:2023-02-10 17:56:34
【问题描述】:
我在 API 平台上有 3 个实体(下面设置架构)。
我的目标是在对评论的每个 PUT、POST 或 DELETE 请求中,有关 mainObject 的链接统计信息都会增加。
有谁知道一个优雅的解决方案?
mainObject(项目评级)
- 身份证,整型 UUID
- 标题,字符
- 类型,整数
- 年,整数
- 用户,内部关键用户
- 已创建,日期
mainObjectStats(关于每个 mainObjects 项目一对一的统计信息)
- 身份证,整数 UUID
- 主要对象 ID,int KEY 主对象
- 计数评论,字符
- countTotalRatingsStar,整数
评论(每个 mainObject 的多对一评论)
- 身份证,整数 UUID
- 主要对象 ID,int KEY 主对象
- 用户ID,内部关键用户
- 身体,字符
- 评分
- 已创建,日期
我尝试编写自定义 Normalizer,但无法达到预期结果。
我想要的是:
- 有人评价一个主要对象
- 关于 mainObject 的统计数据自动更新
- 这样我就可以显示统计数据,而无需获取所有评论并对其进行分组
【问题讨论】:
标签:
php
symfony
doctrine
api-platform.com
【解决方案1】:
您正在寻找事件订阅者。
https://api-platform.com/docs/core/events/
这是一个例子:
final class mainObjectSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
// Add all events you want to track here
return [
KernelEvents::VIEW => [
'changeStats', EventPriorities::POST_VALIDATE
],
];
}
public function changeStats(ViewEvent $event)
{
$mainObject = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
$apiOperationName = $event->getRequest()->get('_api_operation_name');
// Change this if according to which operation you want to track, remove operation name control if needed
if (!($mainObject instanceof MainObject) || Request::METHOD_POST !== $method && $apiOperationName !== MainObject::API_OPERATION_MAINOBJECT_ADD) {
return;
}
// Do your logic here
}
}
小心 !($mainObject instanceof MainObject) 因为这个 !$mainObject instanceof MainObject 在 apiplatform 文档中并且是错误的