وحدة Magento2 CLI: تمكين يعطي خطأ "وحدة (وحدات) غير معروفة"
-
13-12-2019 - |
سؤال
في Magento2، قمت ببناء وحدة مخصصة بسيطة وأريد تمكينها بواسطة CLI:
bin/magento module:enable Vendorname_Modulename
لكنه يعطيني الخطأ التالي:
وحدة (وحدات) غير معروفة:"اسم_المورد_اسم الوحدة"
الوحدة وملفاتها موجودة في app/code/Vendorname/Modulename/
بالطبع قمت بمسح/تعطيل ذاكرة التخزين المؤقت، ومسح الإنشاء، وعدم تشغيل Memcache(d)...
المحلول
registration.php
مفتقد
على ما يبدو لي Vendorname_Modulename
كانت الوحدة في عداد المفقودين registration.php
.أقوم بتشغيل أحدث إصدار من Magento2 من GitHub.
يجب على كل وحدة تسجيل نفسها في ملف ComponentRegistrar
.نموذجي registration.php
لوحدة نمطية (في جذر الوحدة النمطية الخاصة بك) يمكن أن تحتوي على:
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Vendorname_Modulename',
__DIR__
);
راجع أيضًا أي مكون أساسي في Magento app/code/Magento/
أو الخاص بك vendor/magento/
دير
registration.php
ليس في عداد المفقودين
بالإضافة إلى هذا، إذا كان لديك registration.php
file في الوحدة النمطية الخاصة بك، ولكنك لا تزال تحصل على هذا الخطأ، وهذا يعني أن ملفك registration.php
لم يتم تحميله ولا يعرف Magento2 عن الوحدة الخاصة بك.
يجب أن تكون الوحدة الخاصة بك تحت app/code/
(حيث سيقوم Magento2 بالبحث في المجلدات app/code/
وابحث عن الوحدة النمطية الخاصة بك registration.php
)، ولكن إذا كنت قد أنشأت وحدتك كحزمة Composer، فستكون في حزمة Composer vendor/
dir وستحتاج إلى خداع Composer لتحميل الوحدات النمطية الخاصة بك registration.php
(لا يقوم Magento بالبحث في vendor/
بنفسها).
إذا قمت بفحص أي وحدة Magento2 composer.json
في vendor/magento/module-*
, ، سترى "autoload"
القسم الذي يشير إلى registration.php
ملف.لذلك سيقوم Composer بتحميل الوحدة النمطية الخاصة بك تلقائيًا registration.php
والتي سوف "يخبر" Magento2 حيث توجد الوحدة الخاصة بك.
هذه قطعة من الخروج الماجنتو الوحدة النمطية composer.json
:
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Magento\\Checkout\\": ""
}
}
إذا كانت لديك الوحدة النمطية الخاصة بك في مستودع منفصل وتم تحميلها عبر الملحن، فإن ما ورد أعلاه هو الحل الأمثل.إذا لم يكن لديك في مستودع منفصل، فإن الوحدة الخاصة بك لا تنتمي إليها vendor/
ولكن في app/code/
.
نصائح أخرى
<?php
use Magento\Framework\Component\ComponentRegistrar;
$name = implode('_', array_map(
function($part) {
return implode(array_map('ucfirst', explode('-', $part)));
},
array_slice(explode(DIRECTORY_SEPARATOR, __DIR__), -2, 2)
));
ComponentRegistrar::register(ComponentRegistrar::MODULE, $name, __DIR__);
يمكنك استخدامه لأي امتداد دون تغيير أي شيء.
يعمل لأي موقع ملحق (app/code
أو vendor
) ولأي نوع امتداد (وحدة، قاموس ترجمة).
يمكن أن يحدث هذا أيضًا إذا لم يتم تعيين الأذونات بشكل صحيح لدليل الوحدة النمطية وملفاتها.تأكد من إمكانية قراءة الدليل والملفات بواسطة مستخدم الماجنتو والويب.