मैं एक नियंत्रक के लिए \ Drupal :: मॉड्यूलहैंडलर () पर निर्भरता इंजेक्शन का उपयोग कैसे करूं?


15

मैं एक नियंत्रक वर्ग में निम्नलिखित पंक्ति का उपयोग कर रहा हूं।

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

Pareview.sh मुझे यह त्रुटि संदेश दे रहा है।

कक्षाओं में \ Drupal कॉल से बचा जाना चाहिए, इसके बजाय निर्भरता इंजेक्शन का उपयोग करें।

मुझे यह कैसे पूरा करना चाहिए? क्या मुझे एक निर्माता बनाने, एक विधि या सेवा बनाने की आवश्यकता है? यदि हां, तो सेवा को किस कोड की आवश्यकता होनी चाहिए? मुझे एक उदाहरण मिला "ड्रुपल कॉल को कक्षाओं में टाला जाना चाहिए, इसके बजाय निर्भरता इंजेक्शन का उपयोग करें" ऐसे मामले के लिए जहां एक सेवा पहले से मौजूद है।


createमूल विधि को अधिभारित करेगा - यहां आप अपनी ज़रूरत की सेवाओं को इंजेक्ट कर सकते हैं। कंस्ट्रक्टर तब आपको उन लोगों को कक्षा में चर उदाहरण देने के लिए नियत करेगा, जिससे आप उपयोग कर सकते हैं$this->fooInjectedClass->methodName()
केविन

क्या हमारे पास इस बारे में पहले से कोई प्रश्न है? यदि नहीं, तो हमें वास्तव में इसे एक विहित बनाना चाहिए।
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);

आप किसी भी सेवा, मौजूदा लोगों को कोर / कंट्रीब या उन सेवाओं से इंजेक्ट कर सकते हैं जिन्हें आपने किसी *.services.ymlफ़ाइल में कस्टम कोड में परिभाषित किया है ।

एक मुख्य सेवा नाम खोजने के लिए मैं आमतौर पर देखता हूं core.services.yml, क्योंकि यह सबसे तेज़ तरीका है जब आप अपने आईडीई में एक ड्रुपल प्रोजेक्ट पर काम कर रहे हैं।

आप कोर से ही नहीं, सभी सेवाओं को सूचीबद्ध करने के लिए Drupal Console का उपयोग कर सकते हैं :

drupal debug:container

आप डेवेल मॉड्यूल का उपयोग भी कर सकते हैं , जो आपको एक नाम खोजने की अनुमति देता है:

/devel/container/service

1
इस तरह के प्रश्न / उत्तर का विस्तार मुझे सहमत होने पर करना चाहिए, और drupal.org डॉक्स पर वापस योगदान देना चाहिए। वहाँ कुछ है, लेकिन मुझे लगता है कि वास्तविक दुनिया उदाहरण इस तरह से हमेशा मदद करते हैं।
केविन

4
ControllerBaseवर्ग पहले से ही लागू करता है ContainerInjectionInterfaceइंटरफ़ेस। implements ContainerInjectionInterfaceविस्तार करने वाले वर्ग में जोड़ने की आवश्यकता नहीं है ControllerBase
kiamlaluno

ठीक है, सिर्फ @kiamlaluno के रूप में एक ही बात पर ध्यान दिया; उत्तर को अद्यतन करने के लिए भव्य होगा!
स्टेफानोस पेट्राकिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.