سؤال

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

تحديث: أعرف كيف يتم إنشاء المصانع العادية.يتعلق هذا السؤال بالمصانع الخاصة التي تقوم بإنشاء مثيلات للتطبيقات التي تم إنشاؤها لواجهات سمات الامتداد التي تم إنشاؤها.

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

خطوات الكشف عن سمة الامتداد عبر واجهة برمجة تطبيقات الكيان:

  1. يخترع etc/extension_attributes.xml يضيف السمة إلى واجهة الكيان
  2. قم بإنشاء مكون إضافي لإضافة قيمة السمة إلى الكيانات ExtensionAttributes مثال.

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

للحصول على مثال عنصر الاقتباس Magento\Quote\Api\Data\CartItemExtensionFactory يجب أن تستخدم.
أعتقد أن نوع هذا المصنع بطريقة أو بأخرى يجب أن يكون بمثابة الزناد لجيل السحر.

يقوم Magento بعد ذلك بإنشاء الواجهة المطابقة \Magento\Quote\Api\Data\CartItemExtensionInterface مع المستوطنين والحروف لجميع سمات الامتداد.
ومع ذلك، لا يبدو أنها تولد التنفيذ الملموس لتلك الواجهة.على الأقل PHPStorm لا يراها.

كيف تقوم Magento بجمع المعلومات التي تحتاجها لإنشاء الفصل؟كيف يمكن استدعاء أساليب الواجهة التي تم إنشاؤها على مثيل ملموس؟هل هي فئة يتم إنشاؤها في الذاكرة فقط؟

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

تحديث 2:استغرق القليل من الوقت لقراءة \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator و \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator.الآن لدي على الأقل فكرة تقريبية عما يحدث.إذا لم يسبقني أحد إلى ذلك، فسأكتب وصفًا للعملية الكاملة عند نقطة واحدة، حيث أعتقد أنه سيكون مرجعًا مفيدًا.

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

المحلول

بادئ ذي بدء، يحدث الإنشاء التلقائي بناءً على لاحقة اسم الفئة، على سبيل المثال. 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.

لنفترض أن وضع Magento هو 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. يتم إنشاء فئات ExtensionInterface وExtension بناءً على معلومات من extension_attributes.xml, ، يمكن الوصول إليها عبر \Magento\Framework\Api\ExtensionAttribute\Config, ، ثم يتم إنشاء المصنع

إحدى الملاحظات المهمة هي أنه لا يوجد تفضيل لـ ExtensionInterface في di.xml لأنه يتم إنشاء كل من الامتداد وExtensionInterface تلقائيًا.هذه ليست مشكلة لأنه ليس من المتوقع أن يتم إدخال ExtentionInterface عبر الإنشاء مباشرة.

نصائح أخرى

بالنسبة لي، الليلة، فوق إجابة @Alex، أستطيع رؤية السطور

$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

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

هذه السطور تقول:

  • هي الفئة الموجودة في واجهة Extension_attributes الخاصة بنا

  • هل يمتد \Magento\Framework\Api\ExtensibleDataInterface

  • تحتوي هذه الواجهة على وظيفة تسمى getExtensionAttributes

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