আমি কীভাবে কোনও নিয়ামকের কাছে rup দ্রুপাল :: মডিউলহ্যান্ডলার () এর উপর নির্ভরতা ইনজেকশন ব্যবহার করব?


15

আমি একটি নিয়ামক শ্রেণিতে নিম্নলিখিত লাইনটি ব্যবহার করছি।

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

পেরেভিউ.শ আমাকে এই ত্রুটি বার্তা দিচ্ছে।

Classes ক্লাসে ড্রুপাল কল এড়ানো উচিত, পরিবর্তে নির্ভরতা ইনজেকশন ব্যবহার করুন।

আমি কীভাবে এটি সম্পাদন করব? আমার কি কোনও কনস্ট্রাক্টর তৈরি করা, কোনও পদ্ধতি তৈরি করার বা কোনও পরিষেবা তৈরি করা দরকার? যদি তা হয় তবে পরিষেবাটির কী কোডটি দরকার? আমি কোনও উদাহরণ পেয়েছি যেখানে ক্লাসে ড্রুপাল কলগুলি এড়ানো উচিত, পরিবর্তে নির্ভরতা ইনজেকশন ব্যবহার করুন "এমন কোনও ক্ষেত্রে যেখানে কোনও পরিষেবা ইতিমধ্যে বিদ্যমান রয়েছে for


createপ্যারেন্ট পদ্ধতিটি ওভারলোড করবে - এখানে আপনি আপনার প্রয়োজনীয় পরিষেবাগুলি ইনজেক্ট করতে পারেন। কনস্ট্রাক্টর আপনাকে ক্লাসে ভেরিয়েবলগুলি উদাহরণ হিসাবে নির্ধারণ করতে দেবে, যাতে আপনি ব্যবহার করতে পারেন$this->fooInjectedClass->methodName()
কেভিন

আমরা ইতিমধ্যে এই সম্পর্কে একটি প্রশ্ন আছে? যদি তা না হয় তবে আমাদের সত্যই এটি একটি আধ্যাত্মিক করা উচিত।
এমপিডোনাদিও

উত্তর:


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 debug:container

আপনি দেভেল মডিউলটিও ব্যবহার করতে পারেন যা আপনাকে একটি নামের সন্ধান করতে দেয়:

/devel/container/service

1
আমি সম্মত হওয়ার পরে এই ধরণের প্রশ্ন / উত্তরটি প্রসারিত করা উচিত এবং drupal.org ডক্সে ফিরে অবদান রাখতে হবে। এখানে কিছু আছে, তবে আমি সত্যিকারের বিশ্বের উদাহরণগুলি বরাবর সাহায্য করে বলে মনে করি।
কেভিন

4
ControllerBaseবর্গ ইতিমধ্যে প্রয়োগ ContainerInjectionInterfaceইন্টারফেস। implements ContainerInjectionInterfaceপ্রসারিত কোনও শ্রেণিতে যোগ করার দরকার নেই ControllerBase
কিমলালুনো

ঠিক, ঠিক যেমন @kiamlaluno হিসাবে লক্ষ্য করেছেন; উত্তর আপডেট করতে গ্র্যান্ড হবে!
স্টেফানোস পেট্রাকিস 30'19
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.