Módulo Magento 2

Comando CLI Magento 2: criar a classe e registrar no di.xml

A classe do comando está escrita, o módulo está habilitado e o bin/magento list continua sem citar ele. O Magento 2 não descobre comando por convenção de pasta: enquanto a classe não entrar no array de MagentoFrameworkConsoleCommandListInterface pelo di.xml, o console não sabe que ela existe.

A classe

Em app/code/MeuVendor/Sync/Console/Command/ProdutoSync.php, estendendo o Command do Symfony:

<?php
namespace MeuVendorSyncConsoleCommand;

use MagentoFrameworkConsoleCli;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

class ProdutoSync extends Command
{
    protected function configure(): void
    {
        $this->setName('meuvendor:produto:sync');
        $this->setDescription('Sincroniza produtos com o ERP');
        parent::configure();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('Sincronizando...');

        return Cli::RETURN_SUCCESS;
    }
}

O registro em etc/di.xml

Este é o trecho que faltava, em app/code/MeuVendor/Sync/etc/di.xml. É o di.xml global mesmo, não o de adminhtml nem o de frontend: o console roda na área crontab/global. O name do item é livre, mas precisa ser único na instalação inteira, senão um módulo sobrescreve o comando do outro.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="MagentoFrameworkConsoleCommandListInterface">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="meuvendor_produto_sync" xsi:type="object">MeuVendorSyncConsoleCommandProdutoSync</item>
            </argument>
        </arguments>
    </type>
</config>

Sem o xmlns:xsi declarado no config o arquivo não passa na validação do XSD e o setup:upgrade reclama. Por baixo o CommandList recebe esse array pelo construtor e entrega tudo pro MagentoFrameworkConsoleCli, que monta a aplicação do Symfony. O próprio core faz assim: o cron:run está registrado nesse formato no etc/di.xml do Magento_Cron.

Fazer o console enxergar

Com o módulo declarado no registration.php e no etc/module.xml, é essa sequência:

bin/magento module:enable MeuVendor_Sync
bin/magento setup:upgrade
bin/magento cache:clean config
bin/magento list | grep meuvendor

Em modo produção o di já está compilado, então cache:clean não basta: rode bin/magento setup:di:compile depois de qualquer mexida no di.xml. Se ainda não aparecer, apague generated/metadata e generated/code — em produção só com a loja em manutenção, porque até o setup:di:compile terminar o site fica fora do ar. É quase sempre metadado velho grudado, não erro no seu XML.

Post Recentes

Traduzir o pt_BR.csv do Magento 2 em lote sem perder a coluna de origem

Como traduzir duas mil linhas do pt_BR.csv do Magento 2 lendo com fgetcsv e regravando com fputcsv, sem encostar na…

1 dia atrás

Variação não está disponível no WooCommerce: limpar transients e lookup

Produto variável respondendo "Desculpe, este produto não está disponível" mesmo com a variação ativa: limpe os transients do WooCommerce e…

1 dia atrás

WordPress preso no modo de manutenção: apagar o arquivo .maintenance

O site responde 503 com "Momentaneamente indisponível para manutenção programada" depois de um update interrompido. Apague o .maintenance e feche…

2 dias atrás

Preço a partir de no WooCommerce: esconder o intervalo do produto variável

Troque o intervalo R$ 49,00 – R$ 129,00 do produto variável por A partir de R$ 49,00 com o filtro…

3 dias atrás

Massaction Magento 2: ação em massa na grid da sua UI listing

Grid do admin sem checkbox e com o botão Ações vazio? Falta o selectionsColumn e o nó massaction no listing.xml,…

3 dias atrás

Template part não aparece: parts/header.html e o theme.json do tema de blocos

Criou parts/header.html e o Editor de Site não lista a parte? Declare templateParts no theme.json e apague a versão salva…

4 dias atrás