我想就實作某些目標的最佳實踐提出建議。
我有一個名為“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 個請求以檢查相關物體是否存在,我認為不建議這樣做。
我還嘗試更改用戶、課程和平臺上的識別符號,但在這兩種情況下,我在資料庫中都有重復的條目
uj5u.com熱心網友回復:
我設法用自定義非規范化器做我想做的事。
因此,我可以在沒有 ID 的情況下發布和更新來自 tierce 源的資料。
class SessionDenormalizer implements DenormalizerAwareInterface, ContextAwareDenormalizerInterface
{ 使用 DenormalizerAwareTrait;
public function __construct(
private UserRepository $userRepository,
private PlatformRepository $platformRepository,
private CourseRepository $courseRepository,
private SessionRepository $sessionRepository,
)
{
}
private const ALREADY_CALLED = 'SESSION_DENORMALIZER_ALREADY_CALLED';
public function supportsDenormalization($data, string $type, string $format = null, array $context = []): bool
{
if (isset($context[self::ALREADY_CALLED])) {
return false;
}
return $type === Session::class;
}
public function denormalize($data, string $type, string $format = null, array $context = [])
{
if (isset(
$data["user"]["email"],
$data["course"]["slug"],
$data["course"]["platform"]["slug"],
)) {
$user = $this->userRepository->findOneBy(["email" => $data["user"]["email"]]);
$course = $this->courseRepository->findOneBy(["slug" => $data["course"]["slug"]]);
$platform = $this->platformRepository->findOneBy(["slug" => $data["course"]["platform"]["slug"]]);
if ($user && $course && $platform) {
$data["user"]["@id"] = "/v1/users/" . $user?->getId();
$data["course"]["@id"] = "/v1/courses/" . $course?->getId();
$data["course"]["platform"]["@id"] = "/v1/platforms/" . $platform?->getId();
$session = $this->sessionRepository->findOneBy(["cpfID" => $data["cpfID"]]);
if($session) {
$data["@id"] = "/v1/sessions/" . $session->getId();
if(isset($context["collection_operation_name"])) {
$context["collection_operation_name"] = "put";
}
if(isset($context['api_allow_update'])) {
$context['api_allow_update'] = true;
}
}
}
}
$context[self::ALREADY_CALLED] = true;
return $this->denormalizer->denormalize($data , $type , $format , $context);
}
}
服務.yaml :
'app.session.denormalizer.json':
class: 'App\Serializer\Denormalizer\SessionDenormalizer'
tags:
- { name: 'serializer.normalizer', priority: 64 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/345190.html
標籤:symfony api-platform.com 非规范化
上一篇:如何在html.twig上顯示鏈接到主要物體的另一個物體?
下一篇:每次遷移都會改變uuid列的學說
