سؤال

عندما أعتقد أنني قمت بلف رأسي حول نظام DI من Magento 2، يأتي شيء ما ويفككه.
أرى في الكود الأساسي طرقًا مختلفة للوصول إلى المساعد.
على سبيل المثال في Magento\Catalog\Controller\Category::_initCategory هناك هذا:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}

ولكن في Magento\Catalog\Block\Category\View يتم حقن المساعد في المنشئ

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}

يقودني هذا إلى الاعتقاد بأنه يجب الوصول إلى المساعدين بشكل مختلف في وحدات التحكم والكتل (والنماذج) ولكن بعد ذلك وجدت وحدة تحكم حيث يتم حقن المساعد في المنشئ Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute.

يرجى إزالة الضباب بالنسبة لي.
متى يجب أن أستخدم DI ومتى يجب أن أستخدمه objectManager؟و لماذا؟
قرأت هذا السؤال : إنشاء مثيل للمساعدين في Magento 2.هذا مجرد سؤال متابعة لذلك.

هل كانت مفيدة؟

المحلول

أفضل DI حيثما أمكن ذلك، لأن استخدام مدير الكائنات يعد بالفعل انتهاكًا لقانون ديميتر.عند استخدام مدير الكائنات، تكون هذه التبعيات مخفية فقط في منطق الطريقة.

نصائح أخرى

لا أعرف الكثير عن تطبيق Magento، لكن يبدو أن ObjectManager هو محدد الخدمة.

بشكل عام، يعد استخدام محدد موقع الخدمة للوصول إلى التبعيات في كائن أمرًا سيئًا للغاية، قم بالخروج هذا المقال.

يعد تحديد تبعياتك بشكل صريح من خلال المُنشئ طريقة أفضل بكثير.فهو يساعد في اختبار الوحدة ومشكلات وقت التشغيل مع عدم تحديد الخدمات.

إن إدخال مدير الكائنات في الفصل الدراسي هو في الأساس إدخال سجل في فصلك الذي يمكنه الوصول إلى جميع خدمات التطبيقات الخاصة بك، وهو أمر غير صحيح بشكل واضح.

أنا أستعمل ZF2 إلى حد ما وتحديد فئات المصانع الصغيرة بشكل عام للخدمات ووحدات التحكم وأي فئة تتطلب تبعيات.تتمتع فئات المصنع هذه بإمكانية الوصول إلى محدد موقع الخدمة والحصول على جميع الخدمات التي يعتمد عليها الكائن وإدخالها من خلال المُنشئ.يعد استخدام محدد موقع الخدمة في فئة المصنع أمرًا جيدًا لأنه في الغالب يتم التخلص من التعليمات البرمجية، شيء من هذا القبيل هذا على سبيل المثال.

هذه المصانع لا تزال سهلة امتحان.

IMO، استخدم حقن المنشئ حيثما كان ذلك ممكنًا.مرة أخرى، لا أعرف الكثير عن تطبيق Magento وإذا كان لديه مفهوم المصانع، فمن نظرة سريعة يبدو أنه يدعمها، ولكن تحديد فئاتك بشكل صريح واستخدام محدد الخدمة لبناءها في فئات المصنع هو أمر نهج أنظف بكثير.

هذا من شخص لديه تعرض محدود للأنماط المذكورة أعلاه، لذلك أود أيضًا أن أسمع أفكار / تجارب الآخرين حول هذا الموضوع!

المزيد من القراءة

إحدى الطرق الأخرى لاستخدام المساعد (في القوالب) هي:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();

آمل أن يكون مفيدًا إذا لم تكن تعرف بالفعل.

على الرغم من أنه سؤال قديم، إلا أنني لست متأكدًا من ذلك ماريوس حصلت على إجابتها.أعتقد ماريوس يمكن الإجابة عليه بشكل أفضل.أود أن أجيب عليه باختصار.لماذا يقترح Magento 2 استخدام DI بدلاً من المساعد؟

  • جعل العزلة في اختبار الوحدة ممكنًا/سهلًا
  • تحديد تبعيات الفئة بشكل واضح
  • تسهيل التصميم الجيد (مبدأ المسؤولية الفردية (SRP) على سبيل المثال)
  • يقلل استخدام DI في الوحدة النمطية من خطر عدم التوافق عندما يغير Magento التنفيذ الأساسي لتلك الواجهات.هذا مفهوم مهم يجب فهمه لمطوري الإضافات.

لماذا قد لا يستخدم M2 core DI في بعض الحالات؟

  • انخفاض عدد الفصول
  • عدم إنشاء واجهات غير ضرورية
  • لا يوجد خطر من أخطاء عدم التوافق

على الرغم من استخدام وحدة الكتالوج الأساسية كأداة مساعدة، إلا أنها استخدمت DI على نطاق واسع.في بحثي، وجدت أن Magento 2 يستخدم عددًا قليلًا من الوظائف في الملفات المساعدة للكتالوج الأساسي والتي لا تناسب عقود الخدمة.

إذا كان يجب عليك استخدام فئة محددة بواسطة Magento بشكل صريح (مثل \Magento\Catalog\Model\Product)، فاجعل التبعية الضمنية صريحة من خلال الاعتماد على التنفيذ الملموس بدلاً من واجهة عقد الخدمة.

مما لا شك فيه، يجب على مطور الامتدادات استخدام DI بدلاً من Magento1 مثل Helper.عند التنفيذ وفقًا لإرشادات Magento 2، تكون التداعيات محدودة.عند كسر التوصيات، تحدث المشاكل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top