Answers:
registration.php
失踪显然我的Vendorname_Modulename
模块缺少registration.php
。我正在从GitHub运行最新的Magento2版本。
每个模块都必须在中注册自己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
的模块中registration.php
确实有文件,但是仍然出现此错误,则表明您的模块尚未加载,Magento2不了解您的模块。
您的模块应该位于app/code/
(Magento2将在其中搜索文件夹app/code/
并找到模块的registration.php
),但是如果您已将模块构建为Composer软件包,则它将位于Composer的vendor/
目录中,并且需要诱使Composer加载模块的registration.php
(Magento本身不会搜索vendor/
)。
如果您想检查任何Magento2模块composer.json
中vendor/magento/module-*
,你会看到一个"autoload"
部分,其引用的registration.php
文件。因此Composer将自动加载您的模块registration.php
,这将“告诉”您模块所在的Magento2。
这是Magento Checkout模块的片段composer.json
:
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Magento\\Checkout\\": ""
}
}
如果您将模块放在单独的存储库中并通过composer加载,则可以采用上述方法。如果您没有将其放在单独的存储库中,那么您的模块不属于,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
)和任何扩展名类型(模块,翻译词典)。
如果没有正确设置模块目录和文件的权限,也会发生这种情况。确保magento和Web用户可以读取目录和文件。