Score:-1

การพึ่งพาการฉีดในเมธอด create() ของบล็อกปลั๊กอินที่มีอนุพันธ์

ธง us

ฉันพยายามที่จะขยาย เมนู_บล็อก โมดูลเพื่ออนุญาตให้ทำงานกับโดเมน (ผ่าน โดเมน โมดูล). ในการทำเช่นนี้ฉันกำลังขยาย MenuBlock ชั้นเรียนและพยายามเข้าถึง โดเมน.negotiator บริการจากภายใน getDerivativeID(). ฉันกำลังใช้ สร้าง() วิธีการฉีดบริการและจัดเก็บไปยัง $domainNegotiator คุณสมบัติดังนี้

  การสร้างฟังก์ชันสแตติกสาธารณะ (ContainerInterface $container, อาร์เรย์ $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->domainNegotiator = $container->get('domain.negotiator');
    ส่งคืนอินสแตนซ์ $;
  }

เมื่อฉันพยายามโทร $this->domainNegotiator จากภายใน getDerivativeID() ฉันได้รับข้อผิดพลาดที่ระบุว่าไม่มีพร็อพเพอร์ตี้ ดังนั้นฉันจึงไม่สามารถเข้าถึงเมธอดได้ ในการดีบัก ฉันสามารถติดตามปัญหาไปที่ MenuBlock::defaultConfiguration() โทร $this->getDerivativeID().

การกำหนดค่าเริ่มต้นถูกตั้งค่าใน __สร้าง() ข้างใน ลักษณะเด่นของปลั๊กอินบล็อก (อินโทร บล็อกเบส) ในที่สุดมันก็เดือดจนถูกเรียกในชั้นเรียนของฉัน สร้าง() กระบวนการ.

ฉันสามารถแก้ไขปัญหานี้ได้โดยใช้บริการเวอร์ชันที่ไม่ได้ฉีดในไฟล์ของฉัน getDerivativeID() วิธีการ แต่นี่ไม่ใช่วิธีปฏิบัติที่ดี:

$active_domain = \Drupal::service('domain.negotiator')->getActiveDomain();

มีวิธีฉีดการพึ่งพาเพื่อให้พร้อมใช้งานก่อนโทรหรือไม่ ผู้ปกครอง :: สร้าง () ในชั้นเรียนของฉัน สร้าง() กระบวนการ?

cn flag
ง่ายที่สุดคือทำในสิ่งที่คอร์ทำเมื่อไม่แน่ใจว่าบริการได้รับการฉีดหรือไม่ เช่น [`ControllerBase::entityTypeManager()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Controller%21ControllerBase.php/function/ControllerBase%3A%3AentityTypeManager/9.3.x )
Score:3
ธง cn

ระบบปลั๊กอิน Drupal มีสี่ระดับ คำจำกัดความของปลั๊กอิน อนุพันธ์ การกำหนดค่า และสุดท้ายคืออินสแตนซ์รันไทม์

ดังที่คุณเห็นในข้อความแสดงข้อผิดพลาดของคุณ คุณได้กำหนดค่าคำนิยามปลั๊กอินเฉพาะหรืออนุพันธ์ของคำนิยามปลั๊กอิน คำจำกัดความนี้เป็นแบบคงที่และคุณไม่สามารถเปลี่ยนแปลงได้หลังจากที่คุณกำหนดค่าแล้ว

เฉพาะอินสแตนซ์รันไทม์ของปลั๊กอินเท่านั้นที่สามารถตอบสนองต่อเงื่อนไขไดนามิก เช่น โดเมนที่ใช้งานอยู่

Score:1
ธง us

ฉันไม่สามารถคิดออกว่าจะขยายอย่างไร MenuBlock ใช้เท่านั้น สร้าง(). ฉันต้องเปลี่ยนเป็น __สร้าง() และ สร้าง() ระบบและส่งกลับ คงที่() จากภายใน สร้าง() ในขณะที่ฉีดการพึ่งพาจากทั้งสองด้วยตนเอง MenuBlock และ บล็อกเมนูระบบ ชั้นเรียน นี่เป็นบิตที่แข็งแกร่งน้อยกว่าที่จะทำลายถ้า MenuBlock คลาสเคยเปลี่ยนการพึ่งพา แต่ยังคงบรรลุพฤติกรรมที่ตั้งใจไว้ของการใช้การพึ่งพาที่แทรกเข้าไปภายใน getDerivitiveId():

  ฟังก์ชันสาธารณะ __construct (อาร์เรย์ $configuration, $plugin_id, $plugin_definition, MenuLinkTreeInterface $menu_tree, MenuActiveTrailInterface $menu_active_trail, MenuParentFormSelectorInterface $menu_parent_form_selector, EntityTypeManagerInterface $entity_type_manager, DomainNegotiatorInterface $domain_negotiator) {
    $this->domainNegotiator = $domain_negotiator;
    $this->menuParentFormSelector = $menu_parent_form_selector;
    $this->entityTypeManager = $entity_type_manager;
    parent::__construct($configuration, $plugin_id, $plugin_definition, $menu_tree, $menu_active_trail);
  }

  การสร้างฟังก์ชันสแตติกสาธารณะ (ContainerInterface $container, อาร์เรย์ $configuration, $plugin_id, $plugin_definition) {
    ส่งคืนค่าคงที่ใหม่ (
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('menu.link_tree'),
      $container->get('menu.active_trail'),
      $container->get('menu.parent_form_selector'),
      $container->get('entity_type.manager'),
      $container->get('domain.negotiator'));
  }

โพสต์คำตอบ

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