কীভাবে Magento2 সুনির্দিষ্ট এক্সটেনশনফ্যাক্টরি এবং এক্সটেনশনঅ্যাট্রিবিউটইন্টারফেস জেনারেট করে?


28

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

আপডেট : আমি জানি নিয়মিত কারখানাগুলি কীভাবে উত্পন্ন হয়। এই প্রশ্নটি সেই বিশেষ কারখানাগুলির সম্পর্কে যা উত্পন্ন এক্সটেনশন অ্যাট্রিবিউট ইন্টারফেসগুলির জন্য উত্পাদিত প্রয়োগগুলি ইনস্ট্যান্ট করে।

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

কোনও সত্তা API এর মাধ্যমে একটি এক্সটেনশান বৈশিষ্ট্যটি প্রকাশ করার পদক্ষেপ:

  1. etc/extension_attributes.xmlসত্তা ইন্টারফেসে অ্যাট্রিবিউট যুক্ত করে এমন একটি তৈরি করুন
  2. সত্তা ExtensionAttributesউদাহরণগুলিতে বৈশিষ্ট্যটির মান যুক্ত করতে একটি প্লাগইন তৈরি করুন ।

দ্বিতীয় পয়েন্টটি করার জন্য, সত্তা ExtensionAttributesউদাহরণগুলির প্রয়োজন। এই কারণে প্লাগইনটি কোনও কারখানার উপর নির্ভর করে, যা বস্তুর পরিচালক ডিআই-র মাধ্যমে সরবরাহ করে।

উদ্ধৃতি আইটেম উদাহরণ Magento\Quote\Api\Data\CartItemExtensionFactoryব্যবহার করতে হবে।
আমার ধারণা এই কারখানার প্রকারটি কোনও না কোনওভাবে প্রজন্মের যাদুতে ট্রিগার হতে হবে।

ম্যাগেন্টো তারপরে \Magento\Quote\Api\Data\CartItemExtensionInterfaceসমস্ত এক্সটেনশন বৈশিষ্ট্যের জন্য সেটার এবং গিটারগুলির সাথে ম্যাচিং ইন্টারফেস তৈরি করে ।
তবে, মনে হয় না যে এটি ইন্টারফেসের জন্য কংক্রিট বাস্তবায়ন তৈরি করেছে। ইজারা পিএইচপিএসটারম এটি দেখছে না।

ক্লাস তৈরির জন্য প্রয়োজনীয় তথ্য কীভাবে ম্যাজেন্টো সংগ্রহ করবেন? উত্সাহিত ইন্টারফেস পদ্ধতিগুলিকে কীভাবে একটি কংক্রিট উদাহরণে কল করা যেতে পারে? এটি কি এমন একটি শ্রেণি যা কেবল স্মৃতিতে উত্পন্ন হয়?

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

আপডেট 2 : একটু সময় মাধ্যমে পড়তে টুক \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorএবং \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator। এখন আমার অন্তত একটি মোটামুটি ধারণা আছে যা চলছে। যদি কেউ আমাকে এর জন্য মারধর না করে আমি এক পর্যায়ে সম্পূর্ণ প্রক্রিয়াটির বিবরণ লিখব, কারণ আমি মনে করি এটি একটি দরকারী রেফারেন্স হবে।


2
দ্য বিনাই কি .. প্রশ্ন জিজ্ঞাসা করলেন .. ওমজি
অমিত বেরা

উত্তর:


26

শ্রেণীর নাম প্রত্যয়, যেমন Factory, ExtensionInterface(দেখুন \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::EXTENSION_INTERFACE_SUFFIX) বা Extension(দেখুন \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::EXTENSION_SUFFIX) এর উপর ভিত্তি করে সর্বপ্রথম অটোজেনারেশন ঘটছে ।

যথাযোগ্য জেনারেটরটি এখানে প্রত্যয়ের ভিত্তিতে নির্বাচিত হয় \Magento\Framework\Code\Generator::generateClass

আসুন ধরে নেওয়া যাক ম্যাজেন্টো মোডটি রয়েছে developerএবং গায়েবি ক্লাসগুলি ফ্লাইয়ে উত্পন্ন করা যেতে পারে (সংকলক ব্যবহার করার সময় অনুরূপ প্রক্রিয়া ঘটবে)। যখন অবজেক্ট ম্যানেজার তাত্ক্ষণিকভাবে চেষ্টা করার চেষ্টা করে আসুন Magento\Quote\Api\Data\CartItemExtensionFactoryএবং এটি বিদ্যমান না, নিম্নলিখিতটি ঘটে:

  1. অটোলোডার ক্লাস ইনস্ট্যান্ট করতে ব্যর্থ হয় এবং কোড কোড তৈরি এখানে শুরু করে \Magento\Framework\Code\Generator\Autoloader::load
  2. তারপরে শ্রেণিক প্রত্যয়টি নির্ধারণ করা হয় Factory(সমস্ত ঘোষিত প্রত্যয়গুলির তালিকা এখানে পাওয়া যাবে \Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator) এবং সংশ্লিষ্ট কারখানার জেনারেটর শ্রেণি ( Magento\Framework\ObjectManager\Code\Generator\Factory) অনুপস্থিত কারখানা তৈরি করতে ব্যবহৃত হয়
  3. সকল স্বতঃজেনারেট শ্রেণীর সবসময় অন্য শ্রেণীর উপর ভিত্তি করে, ফ্যাক্টরি ক্ষেত্রে, উৎস বর্গ নাম মাত্র সরিয়ে গণনা করা হয় Factoryপ্রত্যয়, এটা তো কেবল Magento\Quote\Api\Data\CartItemExtension। এই শ্রেণিটির অস্তিত্ব নেই এবং অটোলয়েডার দ্বারা অটোজেনারেশনটি আবার শুরু করা হয়েছে, তবে এবার এক্সটেনশন ক্লাসের জন্য
  4. এখন প্রত্যয়টি এই শ্রেণিটি তৈরি করতে ব্যবহৃত হবে Extensionএবং \Magento\Framework\Api\Code\Generator\ExtensionAttributesGeneratorব্যবহৃত হবে
  5. এক্সটেনশন ক্লাস প্রজন্মের উত্স শ্রেণি হিসাবে গণনা করা হয় Magento\Quote\Api\Data\CartItemInterface, এটি বিদ্যমান এবং এক্সটেনশন শ্রেণি সফলভাবে উত্পন্ন হয়েছে। তবে এক্সটেনশন ক্লাস ফাইল অন্তর্ভুক্ত করার প্রয়াসে, অটোজেনারেশন আবারও ট্রিগার করা হয়েছে কারণ Magento\Quote\Api\Data\CartItemExtensionপ্রয়োগগুলি Magento\Quote\Api\Data\CartItemExtensionInterface, যার অস্তিত্ব নেই
  6. প্রত্যয় হয় ExtensionInterfaceএবং \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorপ্রজন্মের জন্য ব্যবহৃত হবে
  7. এক্সটেনশান ইন্টারফেস এবং এক্সটেনশন ক্লাসগুলি তথ্যের ভিত্তিতে তৈরি করা হয় extension_attributes.xml, এর মাধ্যমে অ্যাক্সেসযোগ্য \Magento\Framework\Api\ExtensionAttribute\Config, তারপরে কারখানাটি উত্পন্ন হয়

একটি গুরুত্বপূর্ণ দ্রষ্টব্য হ'ল এক্সটেনশান ইন্টারফেসের জন্য কোনও পছন্দ নেই di.xmlকারণ এক্সটেনশন এবং এক্সটেনশনআইন্টারফেস উভয়ই স্বয়ংক্রিয়ভাবে তৈরি। এটি কোনও সমস্যা নয় কারণ এক্সটেনশন ইন্টারফেসটি সরাসরি নির্মাণের মাধ্যমে ইনজেকশনের আশা করা যায় না।


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

0

আমার জন্য, আজ রাতে, @ অ্যালেক্সের উত্তরের উপরে, আমি লাইনগুলি দেখতে পাচ্ছি

$modelReflection = new \ReflectionClass($extensibleClassName);
        if ($modelReflection->isInterface()
            && $modelReflection->isSubclassOf(self::EXTENSIBLE_INTERFACE_NAME)
            && $modelReflection->hasMethod('getExtensionAttributes')
        ) {
            $this->classInterfaceMap[$extensibleClassName] = $extensibleClassName;
            return $this->classInterfaceMap[$extensibleClassName];
        }

ক্লাসে \Magento\Framework\Api\ExtensionAttributesFactory

এক্সটেনশন ইন্টারফেস উত্পন্ন না হলে আমরা যেখানে ডিবাগ করা শুরু করতে পারি want খুব বেশি এক্সটেনশন বৈশিষ্ট্যটি আমাদের শ্রেণীর কাঠামো সম্পর্কে যেমন ম্যাজেন্টো 2 আশা করবে।

এই লাইনগুলি বলছে:

  • আমাদের এক্সটেনশনে ক্লাসটি_আর একটি ইন্টারফেসকে ভাগ করে দেয়

  • এটি কি \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ এপি \ এক্সটেনসিবলডেটা ইন্টারফেস প্রসারিত করে

  • এই ইন্টারফেসটির getExistanceAttributes নামে একটি ফাংশন রয়েছে

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