Score:2

การกำหนดเส้นทางสามารถใช้พารามิเตอร์ใน URL อยู่แล้วได้หรือไม่

ธง cn

ฉันใช้ 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;
  }

แต่อาจจะหาทางออกที่ดีกว่าได้ ?

Jaypan avatar
de flag
คุณไม่ได้แสดงรหัสที่คุณใช้สร้าง URL ที่ทำให้เกิดข้อผิดพลาด
Jaypan avatar
de flag
ฉันควรเพิ่ม ฉันอาจจะไม่ยุ่งกับเส้นทางไปยังองค์ประกอบย่อย และสร้างนามแฝงสำหรับเส้นทางที่คุณต้องการ
cn flag
ไม่มีรหัส นี่คือ EntityListBuilder::getDefaultOperations ที่สร้างลิงก์โดยอัตโนมัติที่แสดงในคอลัมน์ "การดำเนินการ" ของรายการ ดังนั้นฉันจึงสามารถแทนที่มันได้ หรือแทนที่เมธอดย่อยเช่น Entity::toUrl หรือ Entity::urlRouteParameters ตามที่แนะนำโดย @4k4 ฉันถามตัวเองว่ามี "วิธีมหัศจรรย์" อื่นเช่นการประกาศองค์ประกอบเฉพาะในไฟล์ routing.yml หรือไม่ เช่น: ตัวเลือก: พารามิเตอร์: สิ่งของ: ประเภท: เอนทิตี:{item} #
Score:2
ธง cn

I would override SubItem::urlRouteParameters() and make this independent from the current route match so that the entity can build links on all pages:

  protected function urlRouteParameters($rel) {
    $parameters = parent::urlRouteParameters($rel);
    // assuming the parent relationship is a reference field
    $parameters['item'] = $this->parent->target_id;
    // if the reference field is in the parent you have to run an entity query
    return $parameters;
  }
cn flag
ตกลง. เอนทิตี->toUrl() เรียกเอนทิตี->urlRouteParameters() เพื่อดึงพารามิเตอร์ของเส้นทาง มันแค่ระดับที่สูงขึ้น แต่ถ้าไม่มีวิธีอื่น ฉันก็โอเคที่จะแทนที่หนึ่งในสองวิธีนี้ ขอบคุณสำหรับคำแนะนำของคุณ
4uk4 avatar
cn flag
IMHO วิธีการป้องกันนี้มีไว้เพื่อแทนที่ในกรณีการใช้งานดังกล่าวเท่านั้น

โพสต์คำตอบ

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