Score:1

ฉันจะฉีดการพึ่งพาตามเงื่อนไขได้อย่างไร

ธง cn

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

เงื่อนไขในแบบฟอร์มการกำหนดค่า:

  1. ใช้แบบฟอร์ม Custom1
  2. ใช้แบบฟอร์ม Custom2

หากเปิดใช้งาน âUse Custom1 Formâ ฉันต้องใช้การพึ่งพาการแทรก

เนมสเปซ Drupal\test\Form;

ใช้ Drupal\Core\Form\ConfigFormBase;
ใช้ Drupal\Core\Form\FormStateInterface;
ใช้ Symphony\Component\DependencyInjection\ContainerInterface;
ใช้ Drupal\custom_form1\Services\TestService

/**
 * แบบทดสอบ
 */
คลาส TestForm ขยาย ConfigFormBase {

  /**
   * วัตถุการลงทะเบียน PinCode
   *
   * @var Drupal\custom_form1\Services\TestService;
   */
  ป้องกัน $TestService;

  /**
   * สร้างรูปแบบหลายขั้นตอนรหัสพินใหม่
   *
   * @param Drupal\custom_form1\Services\TestService $test_service
   * ตัวจัดการบริการ
   */
  ฟังก์ชั่นสาธารณะ __construct (TestService $test_service) {
    $this->TestService = $test_service;
  }

  /**
   * {@inheritdoc}
   */
  สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
    ส่งคืนค่าคงที่ใหม่ (
      $container->get('custom_form1.form1_services')
    );
  }
}

ฉันจะเพิ่มได้อย่างไร ใช้ Drupal\custom_form1\Services\TestService ตามเงื่อนไข?

ถ้า custom_form1 ไม่ได้ติดตั้งโมดูล ฉันได้รับข้อผิดพลาด มีแนวคิดอย่างไรที่เราต้องหลีกเลี่ยงข้อผิดพลาดและเพิ่มการพึ่งพาตามเงื่อนไข

Score:3
ธง de

ไม่สามารถเพิ่มการพึ่งพาแบบมีเงื่อนไขตามฟังก์ชันการทำงานภายในคลาส เนื่องจากการฉีดเกิดขึ้นระหว่างการสร้างอินสแตนซ์ของคลาส และเสร็จสมบูรณ์แล้วก่อนที่จะสามารถเรียกเมธอดคลาสได้ แต่คุณฉีดทั้งสองบริการและใช้สิ่งที่คุณต้องการเมื่อคุณต้องการหรือคุณสามารถเรียกใช้บริการที่คุณต้องการใช้แบบคงที่ \Drupal::บริการ() เมื่อคุณต้องการจริง ๆ แม้ว่าจะเป็นการดีกว่าที่จะใช้การพึ่งพาการแทรกเมื่ออยู่ในบริบทของคลาสมากกว่าการเรียกใช้บริการแบบคงที่

sonfd avatar
in flag
Exactly. And in a situation where you need to use a service from a module that isn't a hard dependency of your module, i.e. the module may not be installed, it's perfectly acceptable to not use dependency injection.
Score:1
ธง us

คำถามไม่ได้ทำให้ชัดเจน แต่เนื่องจากคำถามกล่าวถึงการได้รับข้อผิดพลาดเมื่อไม่ได้ติดตั้งโมดูลอื่น ฉันจึงถือว่า เงื่อนไข เป็น เมื่อติดตั้งโมดูลแล้ว. ในกรณีนั้น โมดูลสามารถใช้โค้ดต่อไปนี้ได้

ฟังก์ชั่นสาธารณะ __construct (TestService $test_service = NULL) {
  $this->testService = $test_service;
}

สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
  ส่งคืนค่าคงที่ใหม่ (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services') : NULL
  );
}

ในกรณีนี้ คลาสในโมดูลของคุณควรพร้อมที่จะไม่ได้รับอินสแตนซ์ของคลาสใดๆ อีกทางหนึ่ง โมดูลของคุณสามารถใช้บริการเวอร์ชันที่เรียบง่าย ซึ่งใช้อินเทอร์เฟซเดียวกัน และใช้โค้ดที่คล้ายกับสิ่งต่อไปนี้

ฟังก์ชั่นสาธารณะ __construct (TestServiceInterface $test_service = NULL) {
  $this->testService = $test_service;
}

สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
  ส่งคืนค่าคงที่ใหม่ (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services') : $container->get('mymodule.form1_services')
  );
}

สิ่งนี้ถือว่าบริการทดสอบ ใช้อินเทอร์เฟซที่สามารถนำไปใช้ได้จากบริการแบบง่าย (นอกจากนี้ยังถือว่าเป็นไปได้ที่จะใช้บริการที่เรียบง่าย)

RaMeSh avatar
cn flag
ในกรณีนี้ เราไม่จำเป็นต้องเพิ่ม "use Drupal\custom_form1\Services\TestService;" ในไฟล์ของเรา?
apaderno avatar
us flag
ควรใช้อินเทอร์เฟซหากมี ใช่ คุณต้องการมัน PHP ไม่ตรวจสอบคลาสที่มีอยู่เมื่อใช้ `use Drupal\custom_form1\Services\TestService;` แต่เมื่อใช้อินสแตนซ์ของคลาส

โพสต์คำตอบ

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