【发布时间】:2021-12-15 00:51:14
【问题描述】:
我想就实现某事的最佳实践获得建议。
我有一个名为“Session”的实体的 JSON 输出,其中包含 3 个相关实体(平台、用户、课程),如果它们不存在,我想使用嵌套方式创建这 3 个相关实体。
但如果它们确实存在,我想在 API 平台发挥作用之前将它们的 IRI(或 ID)添加到 JSON 输出。 (或实现此行为的另一种方式)
我天真地认为我应该绑定到 pre_denormalization 事件,但我不知道如何将数据返回给事件。
这是我到目前为止所得到的。
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['onSessionDenormalize', EventPriorities::PRE_DESERIALIZE],
];
}
public function onSessionDenormalize(RequestEvent $event)
{
$data = $event->getRequest()->getContent();
}
public function modifyPayLoad($data) {
$dataObject = json_decode($data);
$platform = $dataObject->platform;
$user = $dataObject->user;
$course = $dataObject->course;
if($this->platformRepository->findOneBy(['slug' => $platform->slug])) {
$platformID = $this->courseRepository->findOneBy(['slug' => $platform->slug])->getId();
$dataObject->id = $platformID;
if($this->userRepository->findOneBy(['email' => $user->slug])) {
$dataObject->id = $this->userRepository->findOneBy(['email' => $user->slug])->getId();
$dataObject->user->platform->id = $platformID;
}
if($this->courseRepository->findOneBy(['slug' => $course->slug])) {
$dataObject->id = $this->courseRepository->findOneBy(['slug' => $course->slug])->getId();
$dataObject->course->platform->id = $platformID;
}
}
return json_encode($dataObject);
}
还有 JSON:
{
"user": {
"firstname": "string",
"lastname": "string",
"address": "string",
"city": "string",
"email": "string",
"zipCode": int,
"hubspotID": int
},
"course": {
"id": "string",
"title": "string",
"platform": {
"slug": "string",
"name": "string"
}
},
"startDate": "2022-01-09T23:59:00.000Z",
"endDate": "2022-02-09T23:59:00.000Z",
"hubspotDealId": int
}
我无法获取此 JSON 中的 ID,因为这些信息是由 Puppeteer APP 提供的,或者我应该先执行 3 个请求来检查相关实体是否存在,我认为不建议这样做。
我还尝试更改用户、课程和平台上的标识符,但在这两种情况下,我在数据库中都有重复的条目
【问题讨论】:
-
您应该使用 DTO 来检索您的资源,而不是将您的逻辑放入非规范化器中。
标签: symfony api-platform.com denormalization