Magento 2 সহায়ক সাহায্যকারী


11

আমি যখন মনে করি আমি Magento 2 থেকে ডিআই সিস্টেমের চারপাশে আমার মাথা জড়িয়ে ফেলেছি তখন কিছু এলো এবং এটি মোড়ক মুছে ফেলবে।
আমি কোনও সহায়ককে অ্যাক্সেস করার জন্য মূল কোডটিতে বিভিন্ন উপায়ে দেখছি।
উদাহরণস্বরূপ এটি Magento\Catalog\Controller\Category::_initCategoryএখানে রয়েছে:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}

কিন্তু Magento\Catalog\Block\Category\Viewসাহায্যকারী ইন ইনজেকশন করা হয় তিনি নির্মাণকারী

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}

এটি আমাকে ভাবতে পরিচালিত করে যে সাহায্যকারীদের নিয়ন্ত্রণকারক এবং ব্লকগুলিতে (এবং মডেলগুলি) আলাদাভাবে অ্যাক্সেস করা উচিত তবে আমি এমন একটি নিয়ামক পেয়েছি যেখানে একজন সহায়ককে কনস্ট্রাক্টারে ইনজেকশন দেওয়া হয় Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute

আমার জন্য কুয়াশা সাফ করুন।
আমার কখন ডিআই ব্যবহার করা উচিত এবং কখন ব্যবহার করা উচিত objectManager? এবং কেন?
আমি এই প্রশ্নটি পড়েছি: ম্যাজেন্টো 2-এ সহায়িকা ইনস্ট্যান্ট করছে । এটি কেবল এটির একটি ফলোআপ প্রশ্ন।

উত্তর:


10

আমি যেখানে সম্ভব সেখানে ডিআইকে প্রাধান্য দেব, কারণ অবজেক্ট ম্যানেজারটি ইতিমধ্যে ডিমেটারের আইন লঙ্ঘন। অবজেক্ট ম্যানেজার ব্যবহার করার সময় এই নির্ভরতাগুলি কেবল পদ্ধতি যুক্তিতে লুকানো থাকে।


হাঁ। আমি রাজী. আমি ডিআই ব্যবহার করব, তবে কেন আমি কেন আগ্রহী? আমি উল্লিখিত ক্লাসগুলি কেউ আবার রিফ্যাক্টর পেতে পারেনি?
মারিয়াস

আফাক তারা এখনও প্রচুর পরিমাণে রিফ্যাক্টর করছে এবং আশা করছে তারা এগুলিও স্পর্শ করবে। তবে অগ্রাধিকারগুলি সম্পর্কেও জানেন না, যদি তারা কোনও পর্যায়ে প্রকৃতপক্ষে প্রকাশ করতে চান তবে উপস্থিত থাকতে হবে। সুতরাং সম্ভবত কিছু নতুন বৈশিষ্ট্য বা অন্যান্য খারাপ অভ্যাস প্রথমে ঠিক করা হবে।
টোবিয়াস

আপনার যদি 10 টি ফাংশনের ক্লাস থাকে এবং কেবলমাত্র 1 টি ফাংশনের জন্য নির্দিষ্ট মডেলের প্রয়োজন? প্রতি 10 টি ফাংশনের জন্য কনস্ট্রাক্টর ইনজেকশনের মাধ্যমে মডেল লোড করা অপ্রয়োজনীয় (পারফরম্যান্স ভিউ থেকে) হবে না যখন আমরা কেবল 1 টি ফাংশনের ভিতরে অবজেক্ট ম্যানেজার ব্যবহার করে এটি লোড করতে পারি?
জনিফ্রি

6

আমি ম্যাজেন্টো বাস্তবায়ন সম্পর্কে তেমন কিছুই জানি না, তবে দেখে মনে হচ্ছে এটি ObjectManagerকোনও সার্ভিস লোকেটার

সাধারণত কোনও অবজেক্টের নির্ভরতা অ্যাক্সেস করতে কোনও পরিষেবা লোকেটার ব্যবহার করা বেশ খারাপ, এই নিবন্ধটি পরীক্ষা করে দেখুন

একটি নির্মাতার মাধ্যমে আপনার নির্ভরতা স্পষ্টভাবে সংজ্ঞায়িত করা একটি আরও ভাল পদ্ধতির। এটি ইউনিট টেস্টিংয়ে সহায়তা করে এবং পরিষেবা সংজ্ঞায়িত না হওয়ায় সময় সমস্যা সমাধান করে।

কোনও ক্লাসে অবজেক্ট ম্যানেজারকে ইনজেকশন করা মূলত আপনার ক্লাসে একটি রেজিস্ট্রি ইনজেকশন করা হয় যা আপনার সমস্ত অ্যাপ্লিকেশন পরিষেবাগুলিতে অ্যাক্সেস পায় যা স্পষ্টতই সঠিক নয়।

আমি জেডএফ 2 একটি মোটামুটি বিট ব্যবহার করি এবং সাধারণত পরিষেবা, নিয়ন্ত্রণকারী এবং নির্ভরশীলতার জন্য যে কোনও শ্রেণীর জন্য ছোট কারখানার ক্লাস সংজ্ঞায়িত করি। এই কারখানার ক্লাসগুলিতে পরিষেবা লোকেটারটিতে অ্যাক্সেস রয়েছে এবং সমস্ত পরিষেবাদি গ্রাহ্য করে যা বস্তুর উপর নির্ভর করে এবং কনস্ট্রাক্টরের মাধ্যমে তাদের ইনজেকশন দেয়। যেমন বেশিরভাগ দূরে কোড, ভালো কিছু নিক্ষেপ করা হয় একটি কারখানা ক্লাসে কোনো পরিষেবার লোকেটার ব্যবহার জরিমানা এই উদাহরণস্বরূপ।

এই কারখানাগুলি এখনও পরীক্ষা করা সহজ ।

আইএমও, যেখানে সম্ভব সেখানে কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করুন। আবার, আমি ম্যাগেন্টোর বাস্তবায়ন সম্পর্কে খুব বেশি জানি না এবং যদি কারখানার ধারণাটি থাকে তবে এটি একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি থেকে দেখে মনে হচ্ছে এটি তাদের সমর্থন করে, তবে স্পষ্টভাবে আপনার ক্লাসগুলি সংজ্ঞায়িত করে ফ্যাক্টরি ক্লাসগুলিতে সেগুলি তৈরি করার জন্য কোনও সার্ভিস লোকেটার ব্যবহার করে একটি অনেক ক্লিনার পদ্ধতির।

এটি এমন কারও কাছ থেকে যার উপরোক্ত উল্লিখিত প্যাটার্সের সীমাবদ্ধতা রয়েছে, তাই আমি এই বিষয়ে অন্যের চিন্তা / অভিজ্ঞতা শুনতেও চাই!

আরও পড়া


সুন্দর ব্যাখ্যার জন্য ধন্যবাদ। আমার প্রশ্নটি ছিল "কেন কোনও সহায়ককে অ্যাক্সেস করার 2 উপায় আছে?" সুতরাং এটি কিছুটা অফ-টপিক তবে এটি আমার কিছু অন্যান্য সন্দেহের সমাধান করেছে। :) ধন্যবাদ।
মারিয়াস

আমি সম্ভবত বলব যে এটি কেবল এমন কিছু যা এখনও রিফ্যাক্টর হয়নি। হয় বা এটি ব্যবহারের সহজতর জিনিস হতে পারে। একটি নিয়ামক মধ্যে সবসময় নির্ভরতা তাদের সমস্ত নির্ভরতা ইনজেকশনের প্রয়োজন, পাল্টা উত্পাদনশীল হিসাবে দেখা যেতে পারে, বিশেষত RAD সঞ্চালনের সময়। নির্ভরতা অ্যাক্সেসের উভয় উপায়ে গ্রাহকদের প্রদান করা আরএডের পদ্ধতির জন্য অনুমতি দেয় তবে এখনও অন্যরা যদি তাদের ইচ্ছা হয় তবে তাদের নির্ভরতা সুস্পষ্টভাবে সংজ্ঞায়িত করার অনুমতি দেয়।
আয়িন হাসান

5

সহায়ক (টেম্পলেটগুলিতে) ব্যবহারের আরেকটি উপায় হ'ল:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();

আমি আশা করি আপনি যদি ইতিমধ্যে না জানতেন তবে এটি কার্যকর।


এটি কোনওভাবে অবজেক্ট ম্যানেজার ব্যবহার করার মতো। নিশ্চিত না এটি সেরা ধারণা।
মারিয়াস

1
উপরের পদ্ধতিটি কেবলমাত্র টেম্পলেটগুলির জন্য যা আমি জানি। অবজেক্ট ম্যানেজার কন্ট্রোলার, ব্লক, মডেল ইত্যাদিতে ব্যবহৃত হয়
rbncha

1
এটি কোডের মতো একই বলপার্কে নেই কারণ টেমপ্লেটগুলিতে কোনও কোড নির্ভরতা নেই। টেমপ্লেটগুলি কেবল গ্রাহক এবং কোনও ভাঙা এনক্যাপসুলেশন সহ ক্লায়েন্টকে দূষিত করবেন না।
demkoryu

আমি জানি না ডেমোরকরিও কী বলতে চাইছে। যে কোনও মডিউলের সহায়ককে কল করার সর্বোত্তম উপায় হ'ল এটি। এটি ম্যাজেন্টো। তারা যেমন বলেছে, প্রতিটি ব্লক / বিভাগের কোডটি মূল স্পর্শ না করে কলযোগ্য / পরিবর্তনযোগ্য হতে চলেছে। সুতরাং, সবকিছু আন্তঃসম্পর্কিত বা নির্ভরশীলতা রয়েছে।
rbncha

2

যদিও এটি পুরানো প্রশ্ন, তবে আমি নিশ্চিত নই যে মারিয়াস এর উত্তর পেয়েছে কিনা । আমি বিশ্বাস করি মারিয়াস এর আরও ভাল উত্তর দিতে পারে। আমি সংক্ষেপে এর উত্তর দিতে চাই। ম্যাগান্টো 2 সাহায্যকারীর পরিবর্তে ডিআই ব্যবহার করার পরামর্শ দেয় কেন?

  • ইউনিট পরীক্ষায় পৃথক করা সম্ভব / সহজ
  • স্পষ্টভাবে কোনও শ্রেণীর নির্ভরতা নির্ধারণ করে
  • ভাল ডিজাইনের সুবিধার্থে (উদাহরণস্বরূপ একক দায়িত্বের নীতি (এসআরপি))
  • আপনার মডিউলটিতে ডিআই ব্যবহার করা যখন ম্যাজেন্টো interface ইন্টারফেসগুলির অন্তর্নিহিত বাস্তবায়ন পরিবর্তন করে তখন বেমানান বাগের ঝুঁকি হ্রাস করে। এটি এক্সটেনশন বিকাশকারীদের বোঝার জন্য একটি গুরুত্বপূর্ণ ধারণা।

কেন এম 2 কোর কিছু ক্ষেত্রে ডিআই ব্যবহার করতে পারে না?

  • ক্লাস সংখ্যা হ্রাস
  • অপ্রয়োজনীয় ইন্টারফেস তৈরি করা হচ্ছে না
  • অসম্পূর্ণতা বাগের কোনও ঝুঁকি নেই

যদিও কোর ক্যাটালগ মডিউলটি সহায়ক হিসাবে ব্যবহৃত হয়েছে, এটি ডিআই ব্যাপকভাবে ব্যবহার করেছে। আমার গবেষণায়, আমি কোর ক্যাটালগ সাহায্যকারী ফাইলগুলিতে সার্ভিস চুক্তির জন্য উপযুক্ত নয় এমন ম্যাজেন্টো 2 ব্যবহার করা কয়েকটি ফাংশন পেয়েছি।

যদি আপনাকে অবশ্যই স্পষ্টভাবে কোনও ম্যাজেন্টো-সংজ্ঞায়িত শ্রেণি (যেমন \ ম্যাজেন্টো \ ক্যাটালগ \ মডেল \ পণ্য) ব্যবহার করতে হয় তবে পরিষেবা চুক্তি ইন্টারফেসের পরিবর্তে কংক্রিট প্রয়োগের উপর নির্ভর করে অন্তর্নিহিত নির্ভরতা সুস্পষ্ট করে তুলুন।

নিঃসন্দেহে, এক্সটেনশন বিকাশকারীকে হেল্পারের মতো Magento1 এর পরিবর্তে ডিআই ব্যবহার করা উচিত। ম্যাজেন্টো 2 এর নির্দেশিকা অনুসারে বাস্তবায়ন করার সময়, ফলাফলটি সীমাবদ্ধ। সুপারিশ ভঙ্গ করার সময়, সমস্যাগুলি ঘটে।


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