ฉันจะใช้การฉีดพึ่งพา \ Drupal :: moduleHandler () ไปยังคอนโทรลเลอร์ได้อย่างไร


15

ฉันกำลังใช้บรรทัดต่อไปนี้ในคลาสคอนโทรลเลอร์

    \Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);

Pareview.sh ให้ข้อความแสดงข้อผิดพลาดนี้แก่ฉัน

ควรหลีกเลี่ยงการโทร Drupal ในชั้นเรียนใช้การฉีดพึ่งพา

ฉันจะทำสิ่งนี้ได้อย่างไร ฉันจำเป็นต้องสร้างนวกรรมิกสร้างวิธีการหรือบริการหรือไม่? ถ้าเป็นเช่นนั้นควรใช้รหัสใดในการบริการ ฉันพบตัวอย่างใน"การเรียกใช้ Drupal ควรหลีกเลี่ยงในคลาสใช้การฉีดพึ่งพาแทน"สำหรับกรณีที่มีบริการอยู่แล้ว


createจะโอเวอร์โหลดวิธีการหลัก - ที่นี่คุณสามารถฉีดบริการที่คุณต้องการ ตัวสร้างจะช่วยให้คุณกำหนดตัวแปรอินสแตนซ์ในชั้นเรียนเพื่อให้คุณสามารถใช้$this->fooInjectedClass->methodName()
Kevin

เรามีคำถามเกี่ยวกับเรื่องนี้หรือไม่? ถ้าไม่เราควรทำให้เรื่องนี้เป็นที่ยอมรับ
mpdonadio

คำตอบ:


21

ในตัวควบคุมคุณฉีดบริการโดยใช้คอนเทนเนอร์ของบริการ ตัวอย่างเช่นModuleHandler:

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;

class MyController extends ControllerBase {

  /**
   * The module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * Constructs a MyController object
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler service.
   */
  public function __construct(ModuleHandlerInterface $module_handler) {
    $this->moduleHandler = $module_handler;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler')
    );  
  }

จากนั้นคุณสามารถหลีกเลี่ยงการ\Drupalโทรโดยใช้บริการที่ถูกฉีด:

$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);

คุณสามารถฉีดบริการใด ๆ ที่มีอยู่จากแกน / contrib หรือบริการที่คุณกำหนดไว้ในรหัสที่กำหนดเองใน*.services.ymlไฟล์

เพื่อค้นหาชื่อบริการหลักที่ฉันมักจะพิจารณาcore.services.ymlเพราะเป็นวิธีที่เร็วที่สุดเมื่อคุณกำลังทำงานในโครงการ drupal ใน IDE ของคุณ

คุณสามารถใช้Drupal Consoleเพื่อแสดงรายการบริการทั้งหมดไม่เฉพาะจากคอร์:

drupal debug:container

คุณยังสามารถใช้โมดูล Develซึ่งช่วยให้คุณค้นหาชื่อ:

/devel/container/service

1
คำถาม / คำตอบประเภทนี้ควรขยายออกไปตามที่ฉันเห็นด้วยและสนับสนุนกลับไปที่เอกสาร drupal.org มีบางอย่างอยู่ที่นั่น แต่ฉันรู้สึกถึงตัวอย่างโลกแห่งความจริงเช่นนี้ช่วยได้เสมอ
Kevin

4
ControllerBaseระดับแล้วดำเนินการContainerInjectionInterfaceอินเตอร์เฟซ ไม่มีความจำเป็นที่จะเพิ่มเป็นชั้นเรียนที่ขยายimplements ContainerInjectionInterface ControllerBase
kiamlaluno

ใช่เพิ่งสังเกตเช่นเดียวกับ @kiamlaluno; จะยิ่งใหญ่เพื่อปรับปรุงคำตอบ!
Stefanos Petrakis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.