ฉันใช้ D9 เพื่อสร้างระบบที่มีเอนทิตีโดยใช้เอนทิตีย่อย
ระบบเอนทิตีหลักใช้เส้นทางต่อไปนี้ : /item/{item}
แต่ละเอนทิตีย่อยเกี่ยวข้องกับเอนทิตีหลักและใช้เส้นทางนี้ : /item/{item}/sub_item/{sub_item}
ดังนั้นในการเข้าถึงแบบฟอร์มแก้ไขหรือลบ จำเป็นต้องใช้เส้นทางต่อไปนี้ :
/item/{item}/sub_item/{sub_item}/edit
/item/{item}/sub_item/{sub_item}/delete
ตัวอย่างเช่น : /item/1/sub_item/4/edit
ฉันประกาศเส้นทางต่อไปนี้:
เอนทิตี.sub_item.edit_form:
เส้นทาง: '/item/{item}/sub_item/{sub_item}/edit'
ค่าเริ่มต้น:
_entity_form: 'sub_item.แก้ไข'
_title: 'แก้ไขรายการย่อย'
ตัวเลือก:
_admin_route: จริง
พารามิเตอร์:
สิ่งของ:
ประเภท: เอนทิตี: รายการ
with_config_overrides: จริง
รายการย่อย:
ประเภท: เอนทิตี: sub_item
with_config_overrides: จริง
ความต้องการ:
_permission: 'จัดการการกำหนดค่าไซต์'
ลิงก์แก้ไขและลบสร้างขึ้นโดยตัวสร้างรายการจาก getOperations ตัวสร้างรายการอยู่ในเส้นทางต่อไปนี้ : /item/1/sub_items (นี่คือ "คอลเลกชัน" เพื่อแสดงรายการย่อยที่แนบมากับรายการหลัก)
ฉันหวังว่า URL ปัจจุบันที่มี item/{item} จะสามารถนำมาใช้ซ้ำได้โดยตรงโดยตัวสร้างลิงก์ แต่นั่นไม่ใช่ข้อเท็จจริง...
Symfony\Component\Routing\Exception\MissingMandatoryParametersException : พารามิเตอร์บังคับบางตัวหายไป ("item") เพื่อสร้าง URL สำหรับเส้นทาง "entity.sub_item.edit_form"ใน Drupal\Core\Routing\UrlGenerator->doGenerate() (บรรทัดที่ 181 ของ /core/lib/Drupal/Core/Routing/UrlGenerator.php)
ฉันพยายามสร้างคลาส htmlRouteProvider เฉพาะสำหรับคลาสเอนทิตีรายการย่อยของฉัน แต่ในกรณีนี้ เส้นทางจะถูกสร้างขึ้นเมื่อล้างแคชแล้ว และฉันไม่สามารถเข้าถึงรายการใน URL เพื่อตั้งค่าได้...
ดังนั้น... คำถามของฉันคือ: ฉันขาดบางสิ่งที่จะทำได้อย่างง่ายดาย หรือฉันต้องใช้วิธี "toUrl()" ของคลาสเอนทิตีรายการย่อยของฉันใหม่เพื่อรวมพารามิเตอร์ "รายการ" ใหม่ "ในทันที " ?
ขอบคุณล่วงหน้าสำหรับข้อเสนอแนะใด ๆ
PS: เป็นวิธีแก้ปัญหาที่ฉันมีจริงในคลาสเอนทิตีรายการย่อยของฉัน:
ฟังก์ชันสาธารณะ toUrl($rel = 'canonical', array $options = []) {
$uri = parent::toUrl($rel, $ตัวเลือก);
$uri->setRouteParameter('item', \Drupal::routeMatch()->getRawParameter('item'));
กลับ $uri;
}
แต่อาจจะหาทางออกที่ดีกว่าได้ ?