يمكن تسمية ObjectManager بأحد المفاهيم الرئيسية التي يقوم عليها بناء Magento2 ، وهو جديد تمامًا عند مقارنته بـ Magento1. إذا تذكرنا Magento1 ، إذن ، لإنشاء الكائنات التي نحتاجها للعمل ، استخدمنا فئة Mage ، التي قدمت طرقًا ثابتة لإنشاء أنواع مختلفة من الكائنات - سواء كانت نماذج أو نماذج موارد أو مساعدين أو لإنشاء كائنات نريد الحصول عليها في مثيل واحد (طريقة Mage :: getSingleton). عند إنشاء Magento2 ، تخلى فريق التطوير عن هذه الفكرة ونفذ مبدأ حقن التبعية وعقود الخدمة (ServiceContracts). هذا ما جعل Magento2 مرنًا للغاية وقابل للتخصيص وقابل للاختبار بسهولة. أيضًا ، فإن وجود الوظائف المبنية حول ObjectManager يجعل من الممكن الحصول على جميع وظائف تخصيص سلوك النظام ،والتي يمكننا تخصيصها من خلال ملف التكوين di.xml.
إذا نظرت عالميًا إلى الوظيفة التي ينفذها ObjectManager ، فيمكننا القول إنها نوع من تنفيذ حاوية DI ، والتي يتم تمثيلها في عالم PHP كـ PSR-11 ، على الرغم من أن ObjectManager نفسه لا ينفذ مباشرةً Psr \ Container \ ContainerInterface (وليس لديه ، الذي يفترضه Psr \ Container \ ContainerInterface). إنها وسيلة مركزية لإنشاء واسترجاع الكائنات. إن وجود مثل هذه الفئة المركزية لتوليد الكائنات المطلوبة له المزايا التالية.
- لا نحتاج إلى تهيئة الكائنات وإدارتها يدويًا (نحتاج أيضًا إلى القول إن ObjectManager يُستخدم لإنشاء كائنات داخل فئتي Factory و Proxy ، والتي يتم إنشاؤها من خلال إنشاء الكود)
- من الممكن أن تحدد من خلال الإعدادات التي يجب أن يتلقاها الفصل مع واجهة معينة واستخدام مبدأ انعكاس التبعية
- يصبح النظام أسهل للاختبار
- من الممكن استخدام فئات الوكيل وفئات المصنع (المصنع)
- حفظ موارد الخادم ، حيث لم تتم إعادة تهيئة بعض الكائنات ، ولكنها مأخوذة من ذاكرة التخزين المؤقت للكائنات التي تم إنشاؤها بالفعل (الإعداد المشترك)
إذا نظرنا إلى النقطة الأخيرة بمزيد من التفصيل ، فيجب أن نقول أن فئة Magento \ Framework \ ObjectManager \ ObjectManager نفسها لها سمة محمية $ _sharedInstances = []. هذه السمة هي التي تحتوي على كائنات يجب ألا يتم إنشاؤها أكثر من مرة واحدة ، وعندما يُطلب منك استلامها ، يتم أخذها ببساطة من هذه المصفوفة (ذاكرة التخزين المؤقت) بواسطة المفتاح - المفتاح هو الاسم الكامل للفئة ، والذي يتضمن مساحة الاسم (مساحة الاسم). ولكن كيف تعرف فئة ObjectManager بالضبط الفئات التي يجب وضعها في هذه المجموعة؟
جميع الكائنات التي تم إنشاؤها من خلال ObjectManager لها الإعداد المشترك = صحيح افتراضيًا. ولكن يمكن تغيير هذا السلوك - لهذا هناك إعداد مشترك خاص في ملف xml. على سبيل المثال ، يمكنك أن تأخذ إعلان فئات المستمعين (مراقب).
<observer name="legacy_model_save"
instance="Magento\Framework\EntityManager\Observer\BeforeEntitySave" shared="false"/>
. , type. , true -, .
ObjectManager . , Http.
index.php, , Magento\Framework\App\Bootstrap
create, 2 :
- — $_SERVER +
create createObjectManagerFactory, Magento\Framework\App\ObjectManagerFactory Bootstrap, , Magento\Framework\App\ObjectManager. , . Magento\Framework\App\Http::launch ObjectManager Magento\Framework\App\ObjectManager::configure. di.xml. ObjectManager preference, type, virtualType. ObjectManager — Magento\Framework\ObjectManager\Config\Config, Magento\Framework\ObjectManager\ConfigInterface. di.xml : preference, type, virtualType . preference’ ObjectManager’ .
2 ObjectManager: create get. , create ( , Factory method), get , , .
— (, Magento\Framework\ObjectManager\FactoryInterface), , Magento\Framework\ObjectManager\Factory. php . Magento\Framework\ObjectManager\Factory\AbstractFactory::createObject, . ObjectManager , , .
Magento\Framework\ObjectManager\Code\Generator. , , , Factory Proxy , (Proxy di.xml) . Proxy-, , , proxy-, , ( Proxy). , . Factory factory method, create, ObjectManager Magento\Framework\App\ObjectManager::create.