ฉันมี REST API แบบกำหนดเองที่ทำงานร่วมกับ Drupal 8 ได้อย่างสมบูรณ์แบบ หลังจากอัปเกรดเป็น Drupal 9.2.X แล้ว ปะ และ โพสต์ วิธีการของ REST API ที่กำหนดเองนี้หยุดทำงาน ตอนนี้พวกเขาส่งข้อยกเว้นต่อไปนี้
RuntimeException: "Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch" ที่เรียกได้ต้องใช้ค่าสำหรับอาร์กิวเมนต์ "$payload" ใน Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (บรรทัดที่ 143 ของ /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php)
รหัสที่ฉันใช้คือรหัสต่อไปนี้
เนมสเปซ Drupal\my_module\Plugin\rest\resource;
ใช้ Drupal\rest\ModifiedResourceResponse;
/**
* จัดเตรียมทรัพยากรเพื่อรับโหมดการดูตามเอนทิตีและบันเดิล
*
* @เรสท์รีซอร์ส(
* id = "update_boxes",
* label = @Translation("กล่องอัพเดท"),
* uri_paths = {
* "canonical" = "/api/container/{container_id}/{type}/{product_id}/boxes"
* }
* )
*/
คลาส UpdateBoxes ขยาย ResourceBase {
/**
* ตัวอย่างผู้ใช้ปัจจุบัน
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
ป้องกัน $currentUser;
ป้องกัน $boxesHandler;
ป้องกัน $event_dispacher;
/**
* {@inheritdoc}
*/
การสร้างฟังก์ชันสแตติกสาธารณะ (ContainerInterface $container, อาร์เรย์ $configuration, $plugin_id, $plugin_definition) {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->currentUser = $container->get('current_user');
$instance->boxesHandler = $container->get('boxes.handler');
$instance->event_dispacher = $container->get('event_dispatcher');
ส่งคืนอินสแตนซ์ $;
}
/**
* ตอบสนองต่อคำขอ PATCH
*
* @param $container_id
* @param $ประเภท
* @param $product_id
* @param $เพย์โหลด
* @return \Drupal\rest\ModifiedResourceResponse
* วัตถุตอบสนอง HTTP
*/
แพตช์ฟังก์ชันสาธารณะ ($container_id = null, $type = null, $product_id = null, $payload) {
// รหัสของฉันที่นี่
}
}
ใน ปะ()
ฉันสามารถอ่าน $น้ำหนักบรรทุก
และดูอาร์เรย์ที่ส่งในคำขอ แต่หลังจากอัปเกรดไซต์แล้ว $น้ำหนักบรรทุก
เป็น โมฆะ
.
วิธีแก้ปัญหาที่ฉันพบคือการเปลี่ยนอาร์กิวเมนต์สุดท้ายของ ปะ()
และแยกส่วนของข้อมูลออกจาก คำขอ $
วัตถุ.
แพตช์ฟังก์ชันสาธารณะ ($container_id = null, $type = null, $product_id = null, คำขอ $request) {
// â¦
$payload = json_decode($request->getContent(), จริง);
}
ฉันไม่พบเอกสารใดๆ เกี่ยวกับการเปลี่ยนแปลงนี้ ฉันไม่แน่ใจว่ามันเป็นแนวทางปฏิบัติที่ดีหรือการใช้งานที่ดีกว่าเพื่อให้เพย์โหลดทำงานได้