Score:1

การสร้างคำขอย่อย HTTP ทำให้ CurrentRouteMatch มีเส้นทางที่ไม่ถูกต้อง

ธง by

ด้วยเหตุผลที่ซับซ้อนและไม่เป็นที่พอใจ[*] ฉันต้องการฝังข้อมูลเอนทิตีจากโมดูล 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 และสามารถบำรุงรักษาได้มากขึ้น

Jaypan avatar
de flag
เหตุใดคุณจึงทำคำขอย่อยและไม่ใช้ไคลเอนต์ Guzzle HTTP เพื่อทำตามคำขอของคุณ
by flag
มีคนแนะนำให้ฉันใช้คำขอย่อยของ Symfony ใน Slack ไคลเอนต์ Guzzle HTTP จะไม่หมายถึงคำขอแยกต่างหากไปยังเซิร์ฟเวอร์จริงหรือ มีเอนทิตีย่อหน้าจำนวนมากที่เกี่ยวข้อง ดังนั้นการเพิ่มคำขอ HTTP จริงอาจส่งผลเสียต่อประสิทธิภาพ
by flag
อัปเดตคำถามเพื่ออธิบายให้ชัดเจนยิ่งขึ้นว่าฉันต้องการใส่ข้อมูล JSON จากอีกอันหนึ่งไว้ในอีกอันหนึ่ง
Score:2
ธง cn

หลังจากเรียกใช้คำขอย่อยแล้ว สแต็กคำขอค่อนข้างยุ่งเหยิง แต่ก็ยังมีคำขอย่อยอยู่ในขณะที่สแต็กการจับคู่เส้นทางถูกล้างข้อมูล หากคุณได้รับการจับคู่เส้นทางปัจจุบัน สิ่งนี้จะส่งคืนการจับคู่เส้นทางที่สร้างขึ้นใหม่ตามคำขอ json api

การแก้ไขอย่างรวดเร็วคือการล้างกองคำขอด้วยตนเอง รวมถึงการตรวจสอบเพื่อให้โค้ดยังคงใช้งานได้เมื่อปัญหาหลักได้รับการแก้ไข:

$current_request = \Drupal::request();

$request = Request::create('/jsonapi/node/page/UUID', 'GET', [], $current_request->cookies->all(), [], $current_request->server->all() );
$request->setSession($current_request->getSession());


$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
ถ้า (\Drupal::request()->getPathInfo() !== $current_request->getPathInfo()) {
  \Drupal::requestStack()->pop();
}

BTW คำขอย่อยของคุณอาจต้องการข้อมูลเมตาเพิ่มเติมจากคำขอหลัก ฉันได้เพิ่มคุกกี้และส่วนหัวของเซิร์ฟเวอร์ในตัวอย่างโค้ดแล้ว

by flag
นั่นแหละ -- การจับคู่เส้นทางของคำขอย่อยทำให้เกิดมลพิษ นั่นเป็นข้อบกพร่องหลักและมีปัญหาหรือไม่ ฉันได้ทำงานทั้งหมดแล้ว ขอบคุณ!! :)
by flag
ไม่พบปัญหาที่มีอยู่ ซึ่งยื่น https://www.drupal.org/project/drupal/issues/3218022
Score:1
ธง by

ฉันค้นพบตั้งแต่นั้นมาว่าโมดูล jsonapi_extras มีฟังก์ชันการทำงานที่เหมือนกันทุกประการ - รับการแสดง JSONAPI ของเอนทิตีโดยสร้างคำขอย่อย ที่ดูเหมือนจะหลีกเลี่ยงปัญหาโดยใช้ http_kernel.basic บริการทำคำขอย่อย ดูเหมือนว่าจะไม่เก็บคำขอสแต็ก ดังนั้นจึงข้ามปัญหาของคำขอหลายรายการที่ถูกติดตาม?

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา