ด้วยเหตุผลที่ซับซ้อนและไม่เป็นที่พอใจ[*] ฉันต้องการฝังข้อมูลเอนทิตีจากโมดูล JSONAPI ภายใน JSON ที่ส่งคืนจากทรัพยากรโมดูล REST
ฉันพยายามทำสิ่งนี้โดยส่งคำขอย่อย HTTP ไปยังเส้นทางโมดูล JSONAPI ภายในคลาสทรัพยากรโมดูล REST
แบบนี้:
$kernel = \Drupal::service('http_kernel');
$current_request = \Drupal::request();
$request = Request::create('/jsonapi/paragraph/' . $paragraph->bundle() . '/' . $paragraph->uuid->value);
$request->setSession($current_request->getSession());
$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
$json = $response->getContent();
$data = json_decode($json, จริง);
ฉันได้รับข้อมูลที่ต้องการแล้ว เยี่ยมมาก!
อย่างไรก็ตาม คำขอหลักไปยังปลายทางทรัพยากร REST ล้มเหลวด้วยสิ่งนี้:
Symfony\Component\Serializer\Exception\NotEncodableValueException: ไม่รองรับการทำให้เป็นอนุกรมสำหรับรูปแบบ "api_json" ใน Symfony\Component\Serializer\Serializer->serialize() (บรรทัดที่ 112 ของ /var/www/vendor/symfony/serializer/Serializer.php)
นี่เป็นเพราะใน Drupal\rest\EventSubscriber\ResourceResponseSubscriber->getResponseFormat() $route = $route_match->getRouteObject();
เป็นเส้นทางโมดูล JSONAPI จากคำขอย่อย ไม่ใช่เส้นทางจากคำขอหลัก
ฉันทำอะไรผิดกับคำขอย่อยของฉัน
[*] โค้ดแบบกำหนดเองจำนวนมหาศาลที่ขับเคลื่อนทรัพยากร REST สำหรับส่วนหน้าแบบแยกส่วน ฉันต้องการเปลี่ยนเป็นการใช้ JSONAPI แต่เป็นการเปลี่ยนแปลงครั้งใหญ่ที่มีผลกระทบอย่างมากที่ส่วนหน้า หากต้องการเปลี่ยนเป็น JSONAPI ทีละขั้น ฉันต้องการเปลี่ยนย่อหน้าบางประเภทเป็นรูปแบบ JSONAPI สามารถเรียกโค้ด PHP ของโมดูล JSONAPI ได้โดยตรง แต่นั่นคือ ไม่ใช่ API สาธารณะ ดังนั้น Drupal รุ่นต่อๆ ไปอาจทำลายมันได้ การสร้างคำขอย่อยนั้นใช้ API และสามารถบำรุงรักษาได้มากขึ้น