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

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…

4 horas atrás

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

13 horas atrás

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…

20 horas atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

1 dia atrás

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

2 dias atrás

style amp-custom acima de 75KB: como cortar o CSS inline do AMP

The author stylesheet specified in tag 'style amp-custom' is too long? Meça o bloco com curl e tire da fila…

2 dias atrás