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


16

আমার মডিউলে প্রদত্ত ইউআরএলটির ইউআরএল নাম পাওয়ার জন্য নীচের কোডটি ব্যবহার করে:

$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);

তবে আমি আমার মডিউলে স্বয়ংক্রিয় পর্যালোচনা ( http://pareview.sh/ ) চালাচ্ছি আমি সতর্কতার নীচে যাচ্ছি:

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

নির্ভরতা ইঞ্জেকশন ব্যবহার করে আমি কীভাবে উপরের কোডটি আপডেট করতে পারি? আমার পুরো ক্লাস কোডটি নীচে দেওয়া হল।

<?php

namespace Drupal\my_module\Controller;

use Drupal\Core\Controller\ControllerBase;

/**
 * MyModule Class defines ajax callback function.
 */
class MyModule extends ControllerBase {
/**
 * Callback function for ajax request.
 */

  public function getUserContent() {
    $alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
    $alias = explode('/', $alias);
    $my_module_views = views_embed_view('my_module', 'default', $alias[2]);
    $my_module= drupal_render($my_module_views);
    return array(
      '#name' => 'my_module_content',
      '#markup' => '<div class="my_module_content">' . $my_module. '</div>',
    );
  }

}


1
অপর প্রশ্নটি স্পষ্টভাবে বলে না যে কীভাবে ওপি এখানে প্রদর্শিত হচ্ছে ত্রুটি এড়ানো যায়। এটি বরং এমন একটি ব্যবহারকারী যা তার পরিকল্পনার বিষয়ে নিশ্চিতকরণ চায় তা থেকে তৈরি করা একটি প্রশ্ন।
কিমলালুনো

উত্তর:


16

ক্লাসটিকে BlockLibraryControllerউদাহরণ হিসাবে ধরুন ; এটি আপনার নিয়ামক হিসাবে একই শ্রেণি প্রসারিত।

আপনি সংজ্ঞা দিন:

  • একটি স্থিতিশীল এবং সর্বজনীন create()পদ্ধতি যা নির্ভরতা ধারক থেকে মানগুলি পায় এবং আপনার শ্রেণীর একটি নতুন অবজেক্ট তৈরি করে
  • একটি শ্রেণীর নির্মাতা যা বস্তুর বৈশিষ্ট্যে পূর্বের পদ্ধতি থেকে পাস করা মানগুলি সংরক্ষণ করে
  • ক্লাস কনস্ট্রাক্টরে পাস করা মানগুলি সংরক্ষণ করতে অবজেক্ট বৈশিষ্ট্যের একটি সেট

আপনার ক্ষেত্রে, কোডটি নীচের মত হবে।

class MyModuleController extends ControllerBase {
  /**
   * The path alias manager.
   *
   * @var \Drupal\Core\Path\AliasManagerInterface
   */
  protected aliasManager;

  /**
   * Constructs a MyModuleController object.
   *
   * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
   *   The path alias manager.
   */
  public function __construct(AliasManagerInterface $alias_manager) {
    $this->aliasManager = $alias_manager;
  }

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

  /**
   * {@inheritdoc}
   */
  public function getUserContent() {
    $alias = $this->aliasManager->getPathByAlias($_POST['url']);
    // Omissis.
  }

}

use \Drupal\Core\Path\AliasManagerInterface;আপনার প্রদর্শিত কোডটি ফাইলের শীর্ষে রাখতে ভুলবেন না ।

পার্শ্ব নোট হিসাবে, ভিউ রেন্ডার করতে আপনি যে কোডটি ব্যবহার করছেন তা ভুল: আপনার ব্যবহারের দরকার নেই drupal_render()কারণ views_embed_view()ইতিমধ্যে একটি রেন্ডারেবল অ্যারে প্রদান করে।
তারপরে, আপনি যে রেন্ডার অ্যারেটি ফিরিয়ে দিচ্ছেন তা সম্ভবত আপনি প্রত্যাশিত আউটপুটটি দিচ্ছেন না। দ্রুপাল থেকে # নাম সম্ভবত ব্যবহার করা যাচ্ছে না এবং রেন্ডার এপিআই ওভারভিউতে বর্ণিত হিসাবে # মার্কআপ আপনি যে মার্কআপটি দিচ্ছেন তা ফিল্টার করে ।

  • # মার্কআপ: নির্দিষ্ট করে যে অ্যারেটি সরাসরি HTML মার্কআপ সরবরাহ করে। মার্কআপটি খুব সহজ না হয়, যেমন অনুচ্ছেদে ট্যাগের ব্যাখ্যা হিসাবে, সাধারণত পরিবর্তে # থিম বা # টাইপ ব্যবহার করা ভাল, যাতে থিমটি মার্কআপটি কাস্টমাইজ করতে পারে। নোট করুন যে মানটি অতিক্রম করেছে \Drupal\Component\Utility\Xss::filterAdmin(), যা এক্সএসএস ভেক্টর নয় এমন এইচটিএমএল ট্যাগগুলির অনুমতিমূলক তালিকার মঞ্জুরি দেওয়ার সময় এক্সএসএস ভেক্টরগুলিকে স্ট্রিপ করে। ( অর্থাত্ <script>এবং <style>অনুমোদিত নয়)) মঞ্জুরিপ্রাপ্ত \Drupal\Component\Utility\Xss::$adminTagsট্যাগগুলির তালিকা দেখুন See যদি আপনার মার্কআপের এমন কোনও ট্যাগের প্রয়োজন হয় যা এই শ্বেত তালিকায় নেই, তবে আপনি একটি থিম হুক এবং টেম্পলেট ফাইল এবং / অথবা কোনও সম্পদ লাইব্রেরি প্রয়োগ করতে পারেন। বিকল্পভাবে, আপনি কোন ট্যাগগুলি ফিল্টার করা হয়েছে তার পরিবর্তনের জন্য অ্যারে কী # নয়েড_ট্যাগ ব্যবহার করতে পারেন।

  • # নাকী_ট্যাগগুলি : # মার্কআপ সরবরাহ করা থাকলে এটি চিহ্নিত করা যায় যে ট্যাগগুলি চিহ্নিতকরণটি ফিল্টার করতে ব্যবহার করছে। মানটি ট্যাগগুলির একটি অ্যারে হওয়া উচিত যা Xss::filter()গ্রহণ করবে। # Playin_text সেট করা থাকলে এই মানটিকে অগ্রাহ্য করা হবে।


1
এটি আমাকে অনেক সাহায্য করে। নির্ভরতা ইনজেকশন জরিমানা কাজ। :) ধন্যবাদ.
এআরুন

ভিউ_ইম্বেড_ভিউ () কেবল একটি অ্যারে সরবরাহ করে। Drupal_render () ব্যবহার না করে আমি কীভাবে এটি এইচটিএমএল সামগ্রী হিসাবে প্রদর্শন করতে পারি?
ARUN

এটি একটি উপস্থাপনযোগ্য অ্যারে প্রদান করে, যা নিয়ামক পদ্ধতি থেকে কোনও পৃষ্ঠা রেন্ডার করে ফিরতে পারে।
কিমলালুনো

শুধু কি views_embed_view()ফিরিয়ে দেয়।
kiamlaluno

আমার নিয়ামক একটি এজ্যাক্স কলের জন্য ব্যবহার করছেন। ফিরে আসা সামগ্রীগুলি পৃষ্ঠায় গতিশীলভাবে আপডেট হবে। views_embed_view()এটির ফলাফল দেখানোর সময় ফিরে Array
আসুন

1

নির্ভরতা ইনজেকশনটি ব্যবহার করতে, আপনার শ্রেণীর ContainerInjectionInterfaceইন্টারফেস প্রয়োগ করা প্রয়োজন । ContainerInjectionInterfaceআদেশের যে প্রয়োগকারী ক্লাসের create()পদ্ধতি থাকতে হবে। ইঞ্জেকড নির্ভরতাগুলি গ্রহণ করে এমন অতিরিক্ত শ্রেণি নির্মাতার সাথে, create()পদ্ধতিটি আপনার শ্রেণীর উপর নির্ভরশীলতার সংজ্ঞায়িত দৃষ্টান্তগুলি পাঠিয়ে আপনার শ্রেণীর উদাহরণ দেয়।

আপডেট: এটি @kiamlaluno দ্বারা যথাযথভাবে চিহ্নিত করা হয়েছে ContainerInjectionInterfaceযেহেতু ControllerBaseইতিমধ্যে এটি প্রয়োগ করে এই ক্ষেত্রে প্রয়োজন হয় না ।

<?php

namespace Drupal\my_module\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Path\AliasManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * MyModule Class defines ajax callback function.
 */
class MyModule extends ControllerBase {

  /** @var \Drupal\Core\Path\AliasManagerInterface $aliasManager */
  protected $aliasManager;

  /**
   * MyModule constructor.
   *
   * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
   */
  public function __construct(AliasManagerInterface $alias_manager) {
    $this->aliasManager = $alias_manager;
  }

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

  /**
   * Callback function for ajax request.
   */
  public function getUserContent() {
    $alias = $this->aliasManager->getPathByAlias($_POST['url']);
    // Your code.
  }

}

এটি আপনার প্রসারিত যথেষ্ট ControllerBase; এটি ContainerInjectionInterfaceইতিমধ্যে কার্যকর করা হয়েছে যেহেতু এটি প্রয়োগ করা প্রয়োজন হবে না ControllerBase
কিমলালুনো

@ কিয়ামলালুনো, এটা সঠিক। আপনার কোড নিখুঁত কাজ করে।
এআরুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.