ম্যাজেন্টো ইভেন্ট পর্যবেক্ষক: একক বনাম মডেল


45

সুতরাং ম্যাজেন্টো একটি পর্যবেক্ষক ঘোষণার 2 উপায় সরবরাহ করে। সিঙ্গেলন এবং মডেল (নতুন উদাহরণ) <type>ম্যাজেন্টো 1.x এ ট্যাগটি নির্দিষ্ট করে sharedএবং ম্যাজেন্টো 2 তে বৈশিষ্ট্যটি নির্দিষ্ট করে ।

ম্যাজেন্টো এটি করার 1 উপায়।

<events>
    <event_name>
        <observers>
            <unique_observer_name>
                <type>model|object|singleton|null</type>
                <class>class/alias_here</class>
                <method>methdNameHere</method>
            </unique_observer_name>
        </observers>
    </event_name>
</events>

ম্যাজেন্টো 2 সংস্করণ:

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

সুতরাং ম্যাজেন্টো 1 এর ক্ষেত্রে <type>ট্যাগটি যদি মডেল বা অবজেক্ট হয় তবে ক্লাসটি ইনস্ট্যান্ট করা হবে Mage::getModel()। এটি singletonবা এটি অনুপস্থিত থাকলে এটি ব্যবহার করে তাত্ক্ষণিকভাবে ব্যবহৃত হয় Mage::getSingleton()

ম্যাজেন্টো 2 এর ক্ষেত্রে যদি sharedহয় falseতবে ক্লাসটি ইনস্ট্যান্ট করা হয় $this->_observerFactory->create() (নতুন উদাহরণ)। সত্য
হলে sharedএটি $this->_observerFactory->get()(সিঙ্গলটন) ব্যবহার করে তাত্ক্ষণিকভাবে প্রয়োগ করা হয়।

দুটি সংস্করণের মধ্যে ইভেন্ট পর্যবেক্ষকের ধারণাটি খুব একইরকম, তবে ম্যাজেন্টো 1-এর বেশিরভাগ পর্যবেক্ষকই একক হিসাবে ব্যবহৃত হয়, কারণ typeট্যাগটি অনুপস্থিত এবং ম্যাগানো 2-তে বেশিরভাগ পর্যবেক্ষক (আমার মনে হয়) রয়েছে shared="false"

আমি হতবাক কখন আমি সিলেটলেট ব্যবহার করব এবং কখন পর্যবেক্ষকদের জন্য নতুন দৃষ্টান্ত ব্যবহার করব?
ম্যাজেন্টো সংস্করণ (1 বা 2) এখানে গুরুত্বপূর্ণ নয়।
একটি সাধারণ ব্যবহারের ক্ষেত্রে প্রতিটি পদ্ধতির (নতুন উদাহরণ বা সিঙ্গেলটন) কাজ করতে হবে


এটির সাথে লড়াইও করছি। যদিও typeএট্রিবিউটটি ব্যবহার করা মোটেই প্রয়োজন হয় না , যাতে আমি এখনই এটিকে এড়িয়ে যাই।
সাইমন

@ সিমন আমি সাধারণত এড়িয়ে যাই। কোনও typeট্যাগই একই জিনিস নয় <type>singleton</type>। তাহলে আমরা পর্যবেক্ষকদের সিলেটলেট তৈরির কারণ কী?
মারিয়াস

এটা আসলে একটি ভাল প্রশ্ন। এজন্য আমি এটি upvated। কেবল এটি উল্লেখ করতে চেয়েছিলেন যে আপনি এটি পুরোপুরি এড়িয়ে যেতে পারেন।
সাইমন

উত্তর:


36

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

বাস্তবে এটি প্রায় কখনও ঘটছে না, তবে ডিফল্ট ভাগ করে নেওয়া = সত্য দ্বারা ম্যাজেন্টো 1 এবং 2 ব্যবহার করুন

ম্যাগনোতে সিঙ্গলটন ডিফল্ট হওয়ার সম্ভবত কারণ: মাইক্রো-অপ্টিমাইজেশন! কেউ ভেবেছিল এটি বার বার অবজেক্ট তৈরি করার প্রয়োজন না পড়লে এটি অনেক সময় সাশ্রয় করবে। অনুরোধ চলাকালীন কয়েকশবার বলা হয়ে থাকে এমন কিছু ইভেন্টের ক্ষেত্রে সত্য হতে পারে, ঘটনাগুলির খারাপ ব্যবহারের ক্ষেত্রে এটি ডিফল্ট হিসাবে করা এমনকি যুক্তিসঙ্গত হতে পারে।


5
একটি যথেষ্ট যথেষ্ট ব্যাখ্যার মত seams। । আর এখন আপনি এটি উল্লেখ করা হয়েছে, এটা আমার মাথায় আঘাত ... singletons জন্য বাস্তব ব্যবহারের ক্ষেত্রে: আপনি যখন পালন করতে চান _save_beforeএবং _save_afterএবং সংরক্ষণ পরে কর্ম থেকে কোনো কিছুর উপর নির্ভর করে _save_before। Duh! আমি কিভাবে এটি মিস করতে পারে?
মারিয়াস

"যা হ'ল কেন ম্যাজেন্টো 2 ডিফল্টরূপে ভাগ করে তোলে = মিথ্যা" এটি ভুল। ম্যাজেন্টো 2 ডিফল্টরূপে ব্যবহার shared=trueকরে
Mage2.PRO


thx, উত্তর আপডেট করেছেন
ফ্লাইংম্যানা

1

ডিফল্টরূপে ম্যাজেন্টো সিঙ্গলটন ব্যবহার করে তাই এটি বাক্সের অভ্যন্তরে সংস্থানগুলি সংরক্ষণ করে। দুটি সমবর্তী প্রক্রিয়া অপারেটিংয়ের মডেল প্রয়োজন কারণ তাদের পৃথকভাবে ডেটা সঞ্চয় এবং রাখা প্রয়োজন। সিঙ্গলটনে নতুন ডেটা লোড হওয়ার সাথে সাথে অবজেক্টটি অস্থির হয়ে উঠবে।

সামনের দিকে ম্যাজেন্টো ২.০ ব্যবহার করার জন্য ভাগ করে নেওয়া অবজেক্ট ব্যবহার করে .. ম্যাজেন্টো ২.০-তে খুব ভাল লিখেছেন ডেস্ট্রাক্টর রয়েছে যা কাজ শেষ হওয়ার সাথে সাথে স্মৃতি পরিষ্কার করে রাখে!

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