Módulo Magento2 CLI:enable dá erro “Módulo(s) desconhecido(s)”
-
13-12-2019 - |
Pergunta
No Magento2 eu construí um módulo personalizado simples e quero habilitá-lo por CLI:
bin/magento module:enable Vendorname_Modulename
Mas está me dando o seguinte erro:
Módulo(s) desconhecido(s):'Nome do fornecedor_Nome do módulo'
O módulo e seus arquivos existem em app/code/Vendorname/Modulename/
É claro que limpei/desativei caches, limpei geração, Memcache(d) não está funcionando...
Solução
registration.php
ausente
Aparentemente meu Vendorname_Modulename
faltava o módulo registration.php
.Estou executando a versão mais recente do Magento2 do GitHub.
Cada módulo deve se registrar no ComponentRegistrar
.Um típico registration.php
para um módulo (na raiz do seu módulo) pode conter:
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Vendorname_Modulename',
__DIR__
);
Veja também qualquer componente principal do Magento em app/code/Magento/
ou seu vendor/magento/
diretório
registration.php
NÃO está faltando
Além disso, se você TEM um registration.php
arquivo em seu módulo, mas você ainda está recebendo este erro, isso significa que seu registration.php
não foi carregado e o Magento2 não conhece o seu módulo.
Seu módulo deve estar sob app/code/
(onde Magento2 irá pesquisar pastas em app/code/
e encontre o seu módulo registration.php
), mas se você construiu seu módulo como um pacote do Composer, ele estará no pacote do Composer vendor/
dir e você precisará enganar o Composer para carregar o seu módulo registration.php
(Magento não pesquisa em vendor/
por si próprio).
Se você verificar qualquer módulo Magento2 composer.json
em vendor/magento/module-*
, você verá um "autoload"
seção que faz referência ao registration.php
arquivo.Então o Composer irá carregar automaticamente o seu módulo registration.php
que irá "dizer" Magento2 onde seu módulo está localizado.
Este é um fragmento do Check-out Magento módulo composer.json
:
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Magento\\Checkout\\": ""
}
}
Se você tiver seu módulo em um repositório separado e carregado via compositor, o caminho acima é o caminho a seguir.Se você não o tiver em um repositório separado, então seu módulo não pertence a vendor/
mas em app/code/
.
Outras dicas
<?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__);
Você pode usá-lo para qualquer extensão sem alterar nada.
Funciona para qualquer local de extensão (app/code
ou vendor
) e para qualquer tipo de extensão (módulo, dicionário de tradução).
Isso também poderá ocorrer se as permissões não estiverem configuradas corretamente para o diretório e os arquivos do módulo.Certifique-se de que o diretório e os arquivos possam ser lidos pelo magento e pelo usuário da web.