ম্যাজেন্টো 2-তে একটি কারখানার জেনারেশনটি কী ট্রিগার করে


39

ম্যাজেন্টো 2 এ এমন অনেকগুলি ক্লাস ফাইল রয়েছে যা হয় প্রাক-উত্পন্ন, বা ফ্লাইতে উত্পন্ন হয়। তারা বাস করে

var/generated

এই উত্পন্ন ফাইলগুলির মধ্যে কারখানার ক্লাস অন্তর্ভুক্ত রয়েছে। ডকুমেন্টেশন থেকে , এটি আমার বুঝতে পেরেছে যে একজন প্রোগ্রামার "অ-ইনজেক্টেবল" অবজেক্টগুলিকে ইনস্ট্যান্ট করতে কারখানার ক্লাস ব্যবহার করে। একটি "ইনজেকশনযোগ্য" অবজেক্ট এমন একটি বস্তু যা নির্ভরতা ইনজেকশনের মাধ্যমে যুক্ত করা যায় না__constructor , সাধারণত এটি তাত্ক্ষণিকভাবে ব্যবহারকারীর ইনপুট প্রয়োজন।

ডকুমেন্টেশন থেকে যা পরিষ্কার নয় তা হ'ল ম্যাজেন্টো 2 কীভাবে জানে যে কারখানার শ্রেণি তৈরি করা দরকার to এই বিট

যদি রান-টাইম মোড বা সংকলকটিতে অবজেক্ট ম্যানেজারের দ্বারা অস্তিত্বহীন কারখানার মুখোমুখি হয় তবে অবজেক্ট ম্যানেজারটি কারখানাটি তৈরি করে।

এটিকে শোনায় যদি আমি অবজেক্ট ম্যানেজারে কারখানার শ্রেণি ব্যবহার করি (বা এক্সটেনশন দ্বারা নির্ভরতা ইনজেকশন __ কনস্ট্রাক্টরে), যে ম্যাজেন্টো 2 এটি আমার জন্য উত্পন্ন করবে। তবে কীভাবে অবজেক্ট ম্যানেজারটি জানবে যে আমি অনুরোধ করছি তা একটি কারখানা?

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

আমি জানি যে অবজেক্ট ম্যানেজার এবং / অথবা কমান্ড কোডটি পুরোপুরি ডাউন করে ফেললে এটি প্রকাশিত হবে তবে আমি আশা করি দীর্ঘ এবং কষ্টকর যাত্রা এড়াতে হবে।

উত্তর:


21

এই সমস্ত কীভাবে একসাথে কাজ করে তার জন্য কিছু আকর্ষণীয় কোডের অবস্থান: https://github.com/magento/magento2/blob/de لاف/ dev / tests / integration / testsuite / Magento / Framework / Code / GeneratorTest.php#L40

বিভিন্ন ধরণের সাথে এখান থেকে বেশিরভাগই এখানে আসে https://github.com/magento/magento2/tree/develop/lib/intern/Magento/Framework/ObjectManager/Code/Genrator তবে এখান থেকে https://github.com/magento বাধা কোডের জন্য / ম্যাজেন্টো 2 / ট্রি / ডেভেলপ / lib / অভ্যন্তরীণ / ম্যাজেন্টো / ফ্রেমওয়ার্ক / ইন্টারসেপশন / কোড / জেনারেটর

এটি সবই এখানে অটোলোডার দ্বারা চালিত হয় https://github.com/magento/magento2/blob/de لاف/lib/intern/Magento/ ফ্রেমওয়ার্ক / কোড / জেনারেটর / অটোলোডার.এফপি# এল 32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

আমি কোডটিতে খুঁজে পাইনি, শর্তগুলির জন্য কারখানাগুলি উত্পন্ন হয়, তবে আমার বোঝার থেকে একটি কারখানার শ্রেণি তৈরি হয় যখন এটি অনুরোধ করা হয় এবং খুঁজে পাওয়া যায় না।
কিছু সংরক্ষিত কীওয়ার্ড রয়েছে Factory, Proxy, Interceptor, যদি ব্যবহৃত হয়, নির্দিষ্ট শ্রেণিগুলি পাওয়া না গেলে কোড উত্পন্নকরণকে ট্রিগার করে।
ফ্যাক্টরি জেনারেশনকে ট্রিগার করে এমন কোডটি পেয়ে আমি আবার পোস্ট করব।
সুতরাং, আপনি যদি ক্লাসের জন্য অনুরোধ করেন Some\Namespace\HereFactoryএবং ক্লাসটি উপস্থিত না থাকে, কারণ এটি কীওয়ার্ডের সাথে শেষ হয় Factoryএটিতে তৈরি হবেvar/generation/Some/Namespace/HereFactory.php


মনে হচ্ছে দস্তাবেজগুলি আপডেট করা উচিত যেহেতু অবজেক্টম্যানেজারটি আসলে একটি উত্পন্নকারী নয়। বিশেষ অটো লোডার উত্তরের অংশ। github.com/magento/magento2/blob/develop/lib/intern//agento/…
ক্রিস ও'টুল

1
এটি আমার অভিজ্ঞতার সাথে তাল মিলিয়েছে (gist.github.com/astorm/f245ce9c761c9a8053aa দেখুন) তবে এটি প্রশ্ন উত্থাপন করে 1.. অবজেক্ট ম্যানেজারের কোডে এটি কোথায় ঘটে (অর্থাত্ প্রকৃত সম্মেলনটি কী) ২. সংকলক / কীভাবে জেনারেটর কি কারখানা জেনারেট করতে জানেন?
অ্যালান স্টর্ম

8

আমি এখনই এই একই মটর স্যুপে খনন করছি। এখন পর্যন্ত আমার বোঝার বিষয় হ'ল স্বয়ংক্রিয়ভাবে উত্পন্ন সমস্ত স্টাফ /var/generationঘোষিত পছন্দসই এবং ইন্টারফেসগুলি থেকে সম্পন্ন হয় app/etc/di.xml

আপনার ইন্টারফেস এবং পছন্দসমূহ di.xmlআপনার ফাইলটিতে ঘোষণা হতে চলেছে /app/code/Vendor/<module>/etc/di.xml

এটি আপনার জন্য অবজেক্ট (গুলি) তৈরি করতে জানে কারণ আপনি নিজের __constructorএবং একটি ইন্টারফেস ঘোষণা করেছেন এবং উপযুক্ত ইন্টারফেসের জন্য স্থানীয় বা স্থানীয়ভাবে কোনও ইন্টারফেসের জন্য অগ্রাধিকার ঘোষণা করেছেন di.xml

আমি আমার মন্তব্য সহ তিনটি দানা লবণের প্রস্তাব দিই।


দরকারী তথ্যের জন্য +1 - তবে দেখে মনে হচ্ছে কারখানাগুলি di.xmlফাইলগুলি বাদে অন্য কোথাও থেকে এসেছে - আপনি অবজেক্ট ম্যানেজারে এমন কিছু পাঠাতে পারেন যা ফ্যাক্টরিতে শেষ হয় এবং এটি আপনার জন্য একটি ফাইল তৈরি করবে।
অ্যালান ঝড়

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