Magento 2 CRUD / অ্যাবস্ট্রাক্ট মডেলটিতে নির্ভরতা ইনজেকশন করা হচ্ছে


12

ম্যাজেন্টো 2 সিআরইউডি মডেলের মধ্যে নির্ভরতা ইনজেকশন করা সম্ভব?

যে - Magento 2 একটি বেস বিমূর্ত মডেল বর্গ আছে: Magento\Framework\Model\AbstractModel। আপনি যদি কোনও সাধারণ তৈরি, পড়ুন, আপডেট করুন, মডেল অবজেক্টটি মুছতে চান তবে আপনি এই শ্রেণীটি নিজের শ্রেণীর সাথে প্রসারিত করবেন।

class Foo extends Magento\Framework\Model\AbstractModel
{
}

আপনার মডেলের __constructপদ্ধতিতে ইঞ্জেকড নির্ভরতা থাকা কি সম্ভব ? আমি চেষ্টা করার পরে, আমি নিম্নলিখিত ত্রুটি পেয়ে শেষ করছি।

মারাত্মক ত্রুটি: অ্যাবস্ট্রাক্ট ক্লাস ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ মডেল \ রিসোর্সমোডেল st অ্যাবস্ট্রাক্ট রিসোর্স ইনস্ট্যান্ট করতে পারে না

অপরাধী মনে হয় AbstractModelএর __constructপদ্ধতি।

public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\Registry $registry,
    \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
    \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
    array $data = []
) {

এই কন্সট্রাক্টর (দুই প্রকার নির্দেশ হয় Magento\Framework\Model\ResourceModel\AbstractResource, Magento\Framework\Data\Collection\AbstractDb) যে হয় না Magento বস্তুর ম্যানেজার ইন্টারফেসগুলি। তারা বিমূর্ত ক্লাস। যখন আমি এই ক্লাসটি প্রসারিত করি এবং আমার ইঞ্জেকড নির্ভরতা যুক্ত করার চেষ্টা করি

class Foo extends Magento\Framework\Model\AbstractModel
{
    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
        \Package\Module\Model\Mine $mine,

    ) {
        //...
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);

    }
}

ম্যাজেন্টো বিলেস যখন অবজেক্ট ম্যানেজার বিমূর্ত ক্লাসগুলি ইনস্ট্যান্ট করার চেষ্টা করে।

আমি আমার অবজেক্ট নির্ভরতা বিমূর্ত ক্লাসের সামনে সরিয়ে "ঠিক" করতে পারি

    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,

        \Package\Module\Model\Mine $mine,

        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
    ) {  

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

এটি কি নিরাপদ? অর্থাত্ এই বিমূর্ত ক্লাসগুলি কি কোনও বিমূর্ত মডেলের কনস্ট্রাক্টারে কেবল লিগ্যাসি কোড রয়েছে, এবং ব্যবহৃত হচ্ছে না? বা সিস্টেমের অংশগুলি এখনও এগুলি ব্যবহার করবে, যার অর্থ একটি সিআরইউডি মডেলটির উপর নির্ভরতা ইনজেকশন করা সম্ভব নয়?

উত্তর:


9

সমস্ত কনস্ট্রাক্টর প্রথম ক্লাসের প্রাইভেট এপি। কনস্ট্রাক্টর ফাংশনটির বিশেষ অর্থ রয়েছে এবং প্যারেন্ট ক্লাসের মতো একই তালিকা / যুক্তির ক্রম থাকতে হবে না।

ম্যাজেন্টো 2 সিআরইউডি মডেলের মধ্যে নির্ভরতা ইনজেকশন করা সম্ভব?

হ্যা অবশ্যই.

এটি কি নিরাপদ?

হ্যাঁ, তবে ম্যাজেন্টো অবজেক্ট ম্যানেজার ধরে নিলেন যে সমস্ত alচ্ছিক পরামিতিগুলি তালিকার শেষে রাখা হয়েছে এবং paraচ্ছিকর পরে প্রয়োজনীয় প্যারামিটারগুলি সমাধান করা হবে না।

$ রিসোর্স, $ রিসোর্স সংগ্রহের আর্গুমেন্টগুলি উত্তরাধিকারসূত্র তবে এখনও মডেল ক্লাসে ব্যাপকভাবে ব্যবহৃত হয়। রিসোর্স এবং সংগ্রহের ক্লাস আরম্ভ করার জন্য বেশিরভাগ মডেল ব্যবহার কোড করে।

protected function _construct() { 
    $this->_init('Magento\AdminNotification\Model\Resource Model\Inbox'); 
}

এই কারণেই এই পরামিতিগুলি .চ্ছিক। তবে, উদাহরণস্বরূপ, ইউনিট পরীক্ষায় আমরা রিসোর্সকে প্রতিস্থাপনের অনুমতি দেওয়ার জন্য কনস্ট্রাক্টরে রিসোর্স বা সংগ্রহ মক পাস করি।


@ কান্দে কি ম্যাজেন্টোর ইঞ্জিনিয়ারিং / আর্কিটেকচার বিভাগ কখনও প্রকাশ্য বিবৃতি দিয়েছে যে কোর ক্লাসগুলির জন্য কনস্ট্রাক্টর অর্ডার অপ্রাসঙ্গিক? বা এটি কি বেশিরভাগ লোকের উপর নির্ভর করে এটির জন্য কাজ করে?
অ্যালান ঝড়

আমি এটিকে "অপ্রাসঙ্গিক" বলব না। কেবল ওএম আপনার নির্মাণকারীর কাছে প্রয়োজনীয় যুক্তিগুলি সরবরাহ করবে এবং এটি প্যারেন্ট ক্লাসে অর্ডারের উপর নির্ভর করে না। তদুপরি, প্যারামিটারগুলির নাম ব্যবহার করুন, সুতরাং এখন
সেগুলি

আমি নিশ্চিত না আপনি কী বলছেন তা আমি বুঝতে পেরেছি। আপনি কি বলছেন যে, ভবিষ্যতের কোনও পর্যায়ে, কোর ম্যাগেন্টো সিস্টেম কোডটি আবার তাত্পর্য / প্যারামিটার ক্রমটিকে তাৎপর্যপূর্ণ হিসাবে বিবেচনা করা শুরু করতে পারে?
অ্যালান ঝড়

আমি বিশ্বাস করি যে না
কান্দি

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

6

এটি নিরাপদ বলে মনে হচ্ছে। কমপক্ষে, ম্যাজেন্টো বেশ কয়েকটি জায়গায় এটি করছে। উদাহরণের জন্য ক্লাসগুলির নীচের (অ-একচেটিয়া) তালিকার __ কনস্ট্রাক্ট পদ্ধতিগুলি দেখুন

  • \ Magento \ থিম \ মডেল \ থিম \ ফাইল
  • \ Magento \ থিম \ মডেল \ ডিজাইন
  • \ Magento \ সেলস \ মডেল \ অর্ডার \ Creditmemo

দুর্ভাগ্যক্রমে, আমি আপনার প্রশ্নের অন্য অংশের উত্তর দিতে পারি না।


4
  1. আপনি কিভাবে আপনার মডেল ব্যবহার করবেন?
  2. আপনার যদি $mineএকটি হয় প্রয়োজনীয় সময়, পরামিতি $resource, $resourceCollectionএবং $dataহয় ঐচ্ছিক । Alচ্ছিক পরামিতি সর্বদা শেষ হওয়া উচিত, অন্যথায় optionচ্ছিক হিসাবে তাদের সাথে কাজ করা কেবল অসম্ভব। সুতরাং এটি আমার কাছে ঠিক আছে যে $mineকোনও anyচ্ছিক পরামিতিগুলির আগে আপনাকে নির্দিষ্ট করা উচিত ।

এই অ্যাবস্ট্রাক্ট প্যারামিটারগুলি নির্ভরতা ইনজেকশন পরামিতিগুলি নয়, এবং যদি ম্যাজেন্টো কোর সিস্টেম কোডটি তাদের সারিটির $mineসামনের দিকে চলে যাওয়ার আশা করে তবে ত্রুটি তৈরি করবে। যদি ম্যাজেন্টো কোর সিস্টেম কোড সেগুলি ব্যবহার না করে তবে তারা সেখানে কেন? এই প্রশ্নটি আমি নীচে পৌঁছানোর চেষ্টা করছি। প্যারামিটার সরানো সহ আমি আমার মডেলটি ব্যবহার করতে পারছি বলে এটি নিরাপদ করে না।
অ্যালান ঝড়

কিছু মডেল এখনও কাস্টম সংস্থান মডেল পাস করতে এই passচ্ছিক পরামিতি ব্যবহার করতে পারে। উদাহরণস্বরূপ, github.com/magento/magento2/blob/develop/app/code/Magento/…
বাসকামুজা

প্যারামিটারটি alচ্ছিক কিনা তা নির্ধারণ করতে ম্যাজেন্টো প্রতিবিম্ব ব্যবহার করে। এবং পিএইচপি হিসাবে দাঁড়িয়ে আগে প্রয়োজন প্যারামিটার সকল প্যারামিটার বিবেচনায় প্রয়োজনীয় । সুতরাং, আপনি যদি $minealচ্ছিক পরামিতিগুলির আগে চলে যান তবে সেগুলি সত্যই optionচ্ছিক হয়ে যায় এবং ম্যাজেন্টো কেবলমাত্র ডিফল্ট মান ( null, array()) পাস করে । আপনি যদি alচ্ছিকের পরে প্রয়োজনীয় প্যারামিটার রাখেন, পিএইচপি চ্ছিক পরামিতিগুলিকে প্রয়োজনীয়গুলি হিসাবে বিবেচনা করে এবং ম্যাজেন্টো সেগুলি ইনস্ট্যান্ট করার চেষ্টা করেছিল (তবে তাদের জন্য কোনও পছন্দ নেই)।
বাসকামুজা

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